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



我想得到Scala中Integers的seq的和。

在我的脑海中,我想把一个加号折叠在这样的整数上:

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并返回一个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的值+(一个值,而不是一个方法(,或。您需要范围中的二进制方法+,它接受两个整数,并且可以eta扩展到(Int, Int) => Int


打开错误消息

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

Seq(1, 2).reduce(+)

进入控制台,然后我得到

错误:未找到:值+

因为任何地方都没有值+。我不知道错误信息怎么会更清楚。

最新更新