我想得到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(_ + _)
将按预期工作。
使.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(+)
进入控制台,然后我得到
错误:未找到:值+
因为任何地方都没有值+
。我不知道错误信息怎么会更清楚。