答案 0 :(得分:8)
这是部分应用的功能。您仅向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 _
或foldLeft(_)(_)
而不是foldLeft
。 val numberFunc = numbers.foldLeft(ListInt)
编辑:哈哈,我刚刚意识到他们对文档中的cubes
做的完全相同。
答案 1 :(得分:2)
我不知道是否有帮助,但是我更喜欢这种语法
val numberFunc = numbers.foldLeft(List[Int]())(_)
然后numberFunc
基本上是与等待参数的实例方法(实例为numbers
)相对应的委托。后来在scala文档示例中成为lambda表达式