为什么在foldLeft中留点会导致编译错误?

时间:2012-10-15 22:33:29

标签: scala functional-programming

当我省略应用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

对于map之类的其他高阶函数,这似乎并不适用,这似乎不关心我是否提供点。

我不认为它是一个相关性的东西,因为我不能只调用foldLeft(1)

2 个答案:

答案 0 :(得分:18)

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

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

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

scala> (l foldLeft 1) _
res3: ((Int, Int) => Int) => Int = <function1>

答案 1 :(得分:3)

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

leftOperand operator rightOperand. 

但由于foldLeft有两个参数列表,因此您最终会在语法层面上找到4个部分:l foldLeft (1) (_ * _)

哪个不符合中缀符号,因此错误。