折叠scala中的元组列表与解构

时间:2009-11-09 13:30:32

标签: scala

scala> val l = List((1,2), (2,3))
l: List[(Int, Int)] = List((1,2), (2,3))

我能做到

scala>  (0 /: l) {(a, i) => i._1 + a}
res20: Int = 3

但我希望能够命名元组的元素。类似的东西:

scala> (0 /: l) {(a, (b,c)) => b + a}
<console>:1: error: not a legal formal parameter
       (0 /: l) {(a, (b,c)) => b + a}
                     ^

我知道我能做到:

scala> (0 /: l) {(a, i) => val (b, c) = i; b + a}
res0: Int = 3

但有没有办法让代码更简洁(我的真实代码涉及几个这样的折叠,我不喜欢需要为每个代码发明一个变量名称(在上面的例子中为'i')

2 个答案:

答案 0 :(得分:18)

尝试一下:

(0 /: l) { case (a, (b, c)) => b + a }

答案 1 :(得分:4)

请注意,除了Walter的回答,您还可以在模式匹配中使用下划线_代替c

val i = (0 /: l) { case (a, (b, _)) => b + a }

它充当任何占位符的Tuple2模式,并且(在我看来)更清楚地表明你实际上没有在计算中使用该值。

此外,在 2.8 中,你可以这样做:

val i = l.map(_._1).sum