我想在Scala中获得seq
中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中对整数序列进行减法(+)?
答案 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(+)
。我不知道如何更清楚地显示错误消息。