Scala foldLeft在地图上

时间:2010-11-14 17:34:54

标签: scala scala-2.8 scala-collections

你如何使用Map.foldLeft?根据{{​​3}}看起来像

foldLeft [B] (z: B)(op: (B, (A, B)) ⇒ B) : B

但我遇到了困难:

Map("first"->1,"second"->2).foldLeft(0)((a,(k,v)) => a+v )
     

错误:不是合法的形式参数

错误指向k前面的空心括号。

4 个答案:

答案 0 :(得分:73)

如果要使用(a, (k, v))语法,则需要建议编译器使用模式匹配。

Map("first"->1, "second"->2).foldLeft(0){ case (a, (k, v)) => a+v }

请注意,case语句需要大括号。

答案 1 :(得分:17)

我认为,你不能像你期望的那样对元组进行模式匹配:

Map("first"->1,"second"->2).foldLeft(0)((a, t) => a + t._2)

实际上,使用值和总和更简单。

Map("first"->1,"second"->2).values.sum

答案 2 :(得分:6)

诀窍是使用部分函数作为代码块,换句话说,你添加一个匹配参数的case语句:

Map("first" -> 1, "second" -> 2).foldLeft(0) { case (a, (k, v)) => a + v }

答案 3 :(得分:5)

这不是你问题的真正答案,但我发现它在开始折叠时很有用,所以无论如何我都会这样说!请注意,/:的{​​{1}}方法“别名”可以更清晰,原因有两个:

foldLeft

请注意,在第二行:

  • 更清楚的是,xs.foldLeft(y) { (yy, x) => /* ... */ } (y /: xs) { (yy, x) => /* ... */ } 值已折叠到集合y
  • 您可以轻松记住xs参数的排序与方法“call”的排序相同
相关问题