在Scala意外行为中折叠右运算符

时间:2016-06-21 20:23:55

标签: scala syntax

为什么

(1 to 5).:\ (0)(_ + _)

工作,而

(1 to 5) :\ (0)(_ + _)

给我一​​个错误?

1 个答案:

答案 0 :(得分:5)

在第一种情况下,您使用二元运算符:\,就像0是唯一参数的方法一样。这将返回一个curried函数,您可以按照预期传递lambda _+_

第二种情况,即使用:\作为中缀运算符,由于运算符优先级而失败。 Scala首先尝试评估(0)(_+_),并提供错误Int(0) does not take parameters,因为(0)不是函数。

为了使用类似第二个版本的语法,您需要添加一些parens:

scala> ((1 to 5) :\ 0)(_+_)
res1: Int = 15

除此之外,每个运算符都是Scala中的一个方法,可以像一个一样使用:

scala> 2.+(3)
res2: Int = 5