为什么可以';在Scala中的一系列整数上减少(+;)?
我想得到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 = {
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(+)
进入控制台,然后我得到
错误:找不到:值+
因为任何地方都没有值+
。我不知道错误信息怎么会更清楚