什么是Scala中的函数文字?

什么是Scala中的函数文字?,scala,functional-programming,Scala,Functional Programming,Scala中的函数文字是什么?我应该在什么时候使用它们?函数文字是定义函数的另一种语法。当您希望将函数作为参数传递给方法(特别是高阶函数,如折叠或筛选操作)但不希望定义单独的函数时,它非常有用。函数文字是匿名的——默认情况下它们没有名称,但您可以通过将它们绑定到变量来为它们命名。函数文字的定义如下: (a:Int, b:Int) => a + b 您可以将它们绑定到变量: val add = (a:Int, b:Int) => a + b add(1, 2) // Result i

Scala中的函数文字是什么?我应该在什么时候使用它们?

函数文字是定义函数的另一种语法。当您希望将函数作为参数传递给方法(特别是高阶函数,如折叠或筛选操作)但不希望定义单独的函数时,它非常有用。函数文字是匿名的——默认情况下它们没有名称,但您可以通过将它们绑定到变量来为它们命名。函数文字的定义如下:

(a:Int, b:Int) => a + b
您可以将它们绑定到变量:

val add = (a:Int, b:Int) => a + b
add(1, 2) // Result is 3
正如我前面所说,函数文字对于作为参数传递给高阶函数很有用。它们还可用于定义嵌套在其他函数中的一行程序或辅助函数


为函数文本提供了一个很好的参考(他们称之为匿名函数)。

在Scala中将函数文本与其他类型的文本进行比较可能会很有用。表示语言认为特别重要的某些类型的值的符号糖。整数文本、字符文本、字符串文本等。Scala将函数视为源代码中可由函数文本表示的第一类值。这些函数值位于一个特殊的区域。比如说,

  • 5
    是一个整数文本,表示
    Int
    类型中的值
  • 'a'
    是一个字符文本,表示
    Char
    类型中的值
  • (x:Int)=>x+2
    是一个函数文本,表示
    Int=>Int
    函数类型中的值
文字通常用作匿名值,也就是说,不首先将其绑定到命名变量。这有助于使程序更加简洁,并且在文本不可重用时适用。例如:

List(1,2,3).filter((x: Int) => x > 2)
vs

Scala编程,第三版 8.3一级功能

函数文本被编译成一个类,当在运行时实例化时,该类是一个函数值。[2]因此,函数文本和值之间的区别在于,函数文本存在于源代码中,而函数值在运行时作为对象存在。区别很像类(源代码)和对象(运行时)之间的区别


我认为指出一个函数文字是如何凌驾于函数n之上的可能是有用的——这将为文字与“长”版本提供一个很好的对比。此外,虽然我有+1,但它通常不是“定义函数的替代语法[你是说方法吗?”),因为函数不是方法——方法是只应用于类和可以分派给它们的消息(类)的构造。函数是“第一类值”(支持
apply
和其他一些对象)。def add=(a:Int,b:Int)=>a+b不一样吗?我可以使用这个“add”来传递给另一个函数,也可以使用underscope操作符从现有函数创建函数文本:def addtworumbers(a:Int,b:Int)=a+b;def add2=addTwoNumbers_函数可以作为参数传递,但方法不能。有没有办法使类型更显式?这是有效的:
List(1,2,3).map(x=>x+10)
这是无效的:
List(1,2,3).map(
List(x:Int):Str=>x.toString)
这是有效的,但不是很明确:
List(1,2,3).map((x:Int=>x.toString)
或者如果我想这样做,我应该使用一个命名函数?@monteiro
List(1,2,3).map(x.toString:String})
val one: Int = 1
val two: Int = 2
val three: Int = 3
val greaterThan2: Int => Boolean = (x: Int) => x > two
List(one,two,three).filter(greaterThan2)