使用Scala折叠元组列表

时间:2014-12-20 04:33:42

标签: scala

这个简单的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

1 个答案:

答案 0 :(得分:12)

fold方法假设一个关联运算符,理论上(例如,当使用并行性时)可以按任意顺序执行。签名因此清楚地表明累积类型必须是集合元素的超类型:

def fold[A1 >: A](z: A1)(op: (A1, A1) ⇒ A1): A1 

推断的超级类型(String, Int)IntAny

这一点在API documentation

中有所描述

您想要的是foldLeftfoldRight,对该类型没有此限制:

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 
}