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

Ale*_*hka 0 syntax scala

为什么

(1 to 5).:\ (0)(_ + _)
Run Code Online (Sandbox Code Playgroud)

工作,而

(1 to 5) :\ (0)(_ + _)
Run Code Online (Sandbox Code Playgroud)

给我一个错误?

eva*_*man 5

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

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

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

scala> ((1 to 5) :\ 0)(_+_)
res1: Int = 15
Run Code Online (Sandbox Code Playgroud)

顺便说一下,每个运算符都是Scala中的一个方法,可以像下面一样使用:

scala> 2.+(3)
res2: Int = 5
Run Code Online (Sandbox Code Playgroud)