11

谁能解释为什么我在省略点符号来应用foldLeft函数时看到以下编译错误?(版本 2.9.2)

scala> val l = List(1, 2, 3)
res19: List[Int] = List(1 ,2 ,3)

scala> l foldLeft(1)(_ * _)
<console>:9: error: Int(1) does not take parameters
                    l foldLeft(1)(_ * _)
                                    ^

scala> l.foldLeft(1)(_ * _) 
res27: Int = 6

这不适用于其他高阶函数,例如mapwhich 似乎并不关心我是否提供点。

我不认为这是一个关联性的事情,因为我不能只是调用foldLeft(1)

4

2 回答 2

18

这是因为 foldLeft 是咖喱。除了使用点符号外,您还可以通过添加括号来解决此问题:

scala> (l foldLeft 1)(_ * _)
res3: Int = 6

哦-关于您关于无法调用的评论foldLeft(l),您可以,但您需要像这样部分应用它:

scala> (l foldLeft 1) _
res3: ((Int, Int) => Int) => Int = <function1>
于 2012-10-15T22:44:35.507 回答
3

省略点是可能的,因为 scala 对中缀表示法的语法支持,它需要 3 个部分:

leftOperand operator rightOperand. 

但是因为foldLeft有两个参数列表,你最终在句法级别有 4 个部分:l foldLeft (1) (_ * _)

这不适合中缀表示法,因此错误。

于 2012-10-16T06:42:37.727 回答