这个简单的scala代码出了什么问题?
val l = List(("a", 1), ("b", 2), ("c", 3), ("d", 4), ("e", 5))
l.fold(0) {(acc: Int, tup: (String, Int)) => acc + tup._2}
:9:错误:类型不匹配; found:(Int,(String,Int))=>诠释 要求:(任何,任何)=>任何 l.fold(0){(acc:Int,tup:(String,Int))=> acc + tup._2}
在其他函数式语言(例如f#)中,这可以工作:
let l = [("a", 1); ("b", 2); ("c", 3); ("d", 4)];;
List.fold(fun accm tup -> accm + (snd tup)) 0 l;;
val it : int = 10
答案 0 :(得分:12)
fold
方法假设一个关联运算符,理论上(例如,当使用并行性时)可以按任意顺序执行。签名因此清楚地表明累积类型必须是集合元素的超类型:
def fold[A1 >: A](z: A1)(op: (A1, A1) ⇒ A1): A1
推断的超级类型(String, Int)
和Int
为Any
。
这一点在API documentation。
中有所描述您想要的是foldLeft
或foldRight
,对该类型没有此限制:
def foldLeft[B](z: B)(f: (B, A) ⇒ B): B
因此:
l.foldLeft(0) { (acc, tup) =>
acc + tup._2
}
或
(0 /: l) {
case (acc, (_, n)) => acc + n
}