haw*_*eye 1 reduce scala infix-operator
我想要得到的总和seq的IntegerS IN斯卡拉.
在我看来,我想在这样的整数上加一个加号:
val seqOfIntegers:Seq[Int] = Seq(1, 2, 3, 4, 5)
val sumOfIntegers = seqOfIntegers.reduce(+)
Run Code Online (Sandbox Code Playgroud)
这是无效的.
相反,我必须这样做:
val sumOfIntegers = seqOfIntegers.reduce(plus)
...
def plus(a:Integer, b:Integer): Integer = { a + b}
Run Code Online (Sandbox Code Playgroud)
(我相信你可以加油 - 但我的观点是原始的加号不起作用,错误信息也不清楚原因.)
我的问题是:为什么我不能在Scala中减少(+)seq的整数?
那是因为+它不是一个函数(即类型的对象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(_ + _)
Run Code Online (Sandbox Code Playgroud)
会按预期工作.
做.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
Run Code Online (Sandbox Code Playgroud)
或者,另外依赖于eta-expansion:
def +(a: Int, b: Int) = a + b
Seq(1,2,3,4,5).reduce(+)
Run Code Online (Sandbox Code Playgroud)
因此,你可以调用.reduce(+)序列,你只需要一个+正确类型(Int, Int) => Int的值(一个值,而不是一个方法),或者你需要一个范围内的二进制方法+,它需要两个整数,并且可以被eta扩展为(Int, Int) => Int.
在错误消息上
错误消息似乎非常明确.如果我没有定义+自己,请输入
Seq(1, 2).reduce(+)
Run Code Online (Sandbox Code Playgroud)
进入控制台,然后我得到
错误:未找到:值+
因为+任何地方都没有价值.我不知道错误信息如何更清楚.
| 归档时间: |
|
| 查看次数: |
123 次 |
| 最近记录: |