这是一个部分应用的函数。您只需提供第一个参数即可foldLeft
(初始值),但您不提供第二个;你推迟一下。在您链接的文档中,他们在下一行中定义了squares
:
val numberFunc = numbers.foldLeft(List[Int]())_
val squares = numberFunc((xs, x) => xs:+ x*x)
看到那个(xs, x) => xs:+ x*x
,这是您在定义时省略的缺少的第二个参数numberFunc
。如果您立即提供,那么numberFunc
不会是一个函数 - 它会是计算值。
所以基本上整个事情也可以写成柯里化形式的一行:
val squares = numbers.foldLeft(List[Int]())((xs, x) => xs:+ x*x)
但是,如果您希望能够一遍又一遍地重用foldLeft,具有相同的集合和初始值,但每次都提供不同的函数,那么定义一个单独的函数是非常方便的numbersFunc
(正如他们在文档中所做的那样)并将其与不同的功能重用,例如:
val squares = numberFunc((xs, x) => xs:+ x*x)
val cubes = numberFunc((xs, x) => xs:+ x*x*x)
...
请注意,如果您忘记下划线,编译器错误消息非常简单:
错误:特征中缺少方法 FoldLeft 的参数列表
LinearSeqOptimized 未应用的方法仅转换为函数
当需要函数类型时。您可以进行此转换
通过书面形式明确foldLeft _
or foldLeft(_)(_)
代替foldLeft
。 val numberFunc = numbers.foldLeft(ListInt)
编辑:哈哈我刚刚意识到他们做了完全相同的事情cubes
在文档中。