为什么我不能在 Scala 中对整数序列进行 reduce(+)?

Why can't I reduce(+) on a seq of integers in Scala?

我想在 Scala 中得到 seqInteger 的总和。

在我看来,我想像这样在整数上加号:

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

这是无效的。

相反,我必须这样做:

val sumOfIntegers = seqOfIntegers.reduce(plus)
...
def plus(a:Integer, b:Integer): Integer = { a + b}

(我相信你可以加糖 - 但我的意思是原来的加号不能作为一个函数工作,错误消息也没有说清楚原因。)

我的问题是:为什么我不能在 Scala 中对整数序列进行归约 (+)?

那是因为+不是一个函数(即Function2[Int, Int, Int]类型的对象,与(Int, Int) => Int是一样的)。相反,它是 Int 上的 方法 ,需要另一个 Int 和 returns 一个 Int。也就是说,你要传递给 reduce 的是 实际上 (a: Int, b: Int) => a.+(b),它可以被糖化为 (a: Int, b: Int) => a + b,然后 _ + _

seq.reduce(_ + _)

会按预期工作。


使 .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

或者,另外依赖 eta 扩展:

def +(a: Int, b: Int) = a + b
Seq(1,2,3,4,5).reduce(+)

因此,您 可以 在序列上调用 .reduce(+),您只需要一个正确类型 (Int, Int) => Int 的值 +(a值,而不是方法), 你需要一个 binary 范围内的方法 +,它需要 two 整数,可以 eta 展开为 (Int, Int) => Int.


关于错误信息

错误信息看起来很明确。如果我自己不定义+,输入

Seq(1, 2).reduce(+)

进入控制台,然后我得到

error: not found: value +

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