1

我想在 Scala中得到 aseq的总和。Integer

在我看来,我想在整数上加一个加号,如下所示:

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 中对整数序列进行归约(+)?

4

1 回答 1

6

那是因为+is 不是函数(即类型为 的对象,Function2[Int, Int, Int]与 相同(Int, Int) => Int)。相反,它是一个on方法Int,它接受另一个Int并返回一个Int. 也就是说,您要传递reduce的实际上是(a: Int, b: Int) => a.+(b),可以将其糖化为(a: Int, b: Int) => a + bthen _ + _

那是,

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(+)

进入控制台,然后我得到

错误:未找到:值 +

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

于 2018-07-30T11:51:48.373 回答