目录

Scala 函数–部分应用的函数

2018年03月05日 08:35 | 2091次浏览

前面例子中我们使用“_” 来代替单个的参数,实际上你也可以使用“_”来代替整个参数列表,比如说,你可以使用 print _ 来代替 println (_).

someNumbers.foreach(println _)

Scala编译器自动将上面代码解释成:

someNumbers.foreach( x => println (x))

因此这里的“_” 代表了Println的整个参数列表,而不仅仅替代单个参数。

当你采用这种方法使用“_”,你就创建了一个部分应用的函数(partially applied function)。 在Scala中,当你调用函数,传入所需参数,你就把函数“应用”到参数。 比如:一个加法函数。

scala> def sum = (_:Int) + (_ :Int) + (_ :Int)
sum: (Int, Int, Int) => Int
scala> sum (1,2,3)
res0: Int = 6

一个部分应用的函数指的是你在调用函数时,不指定函数所需的所有参数,这样你就创建了一个新的函数,这个新的函数就称为原始函数的部分应用函数,比如说我们固定sum的第一和第三个参数,定义如下的部分应用函数:

scala> val b = sum ( 1 , _ :Int, 3)
b: Int => Int = <function1>
scala> b(2)
res1: Int = 6

变量b的类型为一函数,具体类型为Function1 (带一个参数的函数),它是由sum 应用了第一个和第三个参数,构成的。

调用b(2),实际上调用sum (1 ,2,3)。


再比如我们定义一个新的部分应用函数,只固定中间参数:

scala> val c = sum (_:Int, 2, _:Int)
c: (Int, Int) => Int = <function2>
scala> c(1,3)
res2: Int = 6

变量c的类型为Function2,调用c(1,3) 实际上也是调用sum (1,2,3)。


在Scala中,如果你定义一个部分应用函数并且能省去所有参数,比如println _ ,你也可以省掉“_”本身,比如:

someNumbers.foreach(println _)

可以写成:

someNumbers.foreach(println)


小说《我是全球混乱的源头》

感觉本站内容不错,读后有收获?小额赞助,鼓励网站分享出更好的教程