为什么我不能在Scala中减少(+)seq的整数?

haw*_*eye 1 reduce scala infix-operator

我想要得到的总和seqIntegerS IN斯卡拉.

在我看来,我想在这样的整数上加一个加号:

val seqOfIntegers:Seq[Int] = Seq(1, 2, 3, 4, 5)
val sumOfIntegers = seqOfIntegers.reduce(+)
Run Code Online (Sandbox Code Playgroud)

这是无效的.

相反,我必须这样做:

val sumOfIntegers = seqOfIntegers.reduce(plus)
...
def plus(a:Integer, b:Integer): Integer = { a + b}
Run Code Online (Sandbox Code Playgroud)

(我相信你可以加油 - 但我的观点是原始的加号不起作用,错误信息也不清楚原因.)

我的问题是:为什么我不能在Scala中减少(+)seq的整数?

And*_*kin 6

那是因为+它不是一个函数(即类型的对象Function2[Int, Int, Int],它是相同的(Int, Int) => Int).相反,它是一个方法Int,这需要另一个Int和返回Int.也就是说,你想传递什么reduce实际上是(a: Int, b: Int) => a.+(b),可以加糖入(a: Int, b: Int) => a + b,然后_ + _.

那是,

seq.reduce(_ + _)
Run Code Online (Sandbox Code Playgroud)

会按预期工作.


.reduce(+)工作

如果要+作为参数传递,则必须定义一个+扩展的值(Int, Int) => Int.例如:

object + extends ((Int, Int) => Int) { def apply(a: Int, b: Int): Int = a + b }
Seq(1,2,3,4,5).reduce(+) 
// res0: Int = 15
Run Code Online (Sandbox Code Playgroud)

或者,另外依赖于eta-expansion:

def +(a: Int, b: Int) = a + b
Seq(1,2,3,4,5).reduce(+)
Run Code Online (Sandbox Code Playgroud)

因此,你可以调用.reduce(+)序列,你只需要一个+正确类型(Int, Int) => Int的值(一个值,而不是一个方法),或者你需要一个范围内的二进制方法+,它需要两个整数,并且可以被eta扩展为(Int, Int) => Int.


在错误消息上

错误消息似乎非常明确.如果我没有定义+自己,请输入

Seq(1, 2).reduce(+)
Run Code Online (Sandbox Code Playgroud)

进入控制台,然后我得到

错误:未找到:值+

因为+任何地方都没有价值.我不知道错误信息如何更清楚.