为什么可以';在Scala中的一系列整数上减少(+;)?

为什么可以';在Scala中的一系列整数上减少(+;)?,scala,reduce,infix-operator,Scala,Reduce,Infix Operator,我想得到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 = {

我想得到Scala中
Integer
s的
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(_ + _)
将按预期工作


制作
。减少(+)
工作量

如果要将
+
作为参数传递,则必须定义一个扩展
(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
(一个值,而不是一个方法)的值
+
,或者您需要范围内的二进制方法
+
,它需要两个整数,并且可以扩展为
(Int,Int)=>Int


关于错误消息的

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

Seq(1, 2).reduce(+)
进入控制台,然后我得到

错误:找不到:值+


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

那是因为
+
不是一个函数(也就是说,类型为
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(_ + _)
将按预期工作


制作
。减少(+)
工作量

如果要将
+
作为参数传递,则必须定义一个扩展
(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
(一个值,而不是一个方法)的值
+
,或者您需要范围内的二进制方法
+
,它需要两个整数,并且可以扩展为
(Int,Int)=>Int


关于错误消息的

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

Seq(1, 2).reduce(+)
进入控制台,然后我得到

错误:找不到:值+

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