为什么我不能在 Scala 中对整数序列进行 reduce(+)?
Why can't I reduce(+) on a seq of integers in Scala?
我想在 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 中对整数序列进行归约 (+)?
那是因为+
不是一个函数(即Function2[Int, Int, Int]
类型的对象,与(Int, Int) => Int
是一样的)。相反,它是 Int
上的 方法 ,需要另一个 Int
和 returns 一个 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
的值 +
(a值,而不是方法),或 你需要一个 binary 范围内的方法 +
,它需要 two 整数,可以 eta 展开为 (Int, Int) => Int
.
关于错误信息
错误信息看起来很明确。如果我自己不定义+
,输入
Seq(1, 2).reduce(+)
进入控制台,然后我得到
error: not found: value +
因为任何地方都没有价值 +
。我不知道错误消息如何更清楚。
我想在 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 中对整数序列进行归约 (+)?
那是因为+
不是一个函数(即Function2[Int, Int, Int]
类型的对象,与(Int, Int) => Int
是一样的)。相反,它是 Int
上的 方法 ,需要另一个 Int
和 returns 一个 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
的值 +
(a值,而不是方法),或 你需要一个 binary 范围内的方法 +
,它需要 two 整数,可以 eta 展开为 (Int, Int) => Int
.
关于错误信息
错误信息看起来很明确。如果我自己不定义+
,输入
Seq(1, 2).reduce(+)
进入控制台,然后我得到
error: not found: value +
因为任何地方都没有价值 +
。我不知道错误消息如何更清楚。