为什么我不能在Scala中对一系列整数进行减少(+)?

时间:2018-07-30 11:42:47

标签: scala reduce infix-operator

我想在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中对整数序列进行减法(+)?

1 个答案:

答案 0 :(得分: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(_ + _)

将按预期工作。


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

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

因此,您可以在序列上调用.reduce(+),您只需要正确类型+的值(Int, Int) => Int(一个值,而不是一个方法),,您需要在范围内使用 binary 方法+,该方法采用两个整数,并且可以扩展为{ {1}}。


关于错误消息

错误消息似乎很明确。如果我自己没有定义(Int, Int) => Int,请输入

+

进入控制台,然后我得到

  

错误:找不到:值+

因为在任何地方都没有值Seq(1, 2).reduce(+) 。我不知道如何更清楚地显示错误消息。