38

你如何使用 Map.foldLeft?根据文档,它看起来像

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

但我遇到了困难:

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

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

错误指向 k 前面的左括号。

4

4 回答 4

89

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

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

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

于 2010-11-14T18:10:51.293 回答
18

我认为,您不能按预期对元组进行模式匹配:

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

实际上,使用 values 和 sum 更简单。

Map("first"->1,"second"->2).values.sum
于 2010-11-14T17:47:03.517 回答
6

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

Map("first" -> 1, "second" -> 2).foldLeft(0) { case (a, (k, v)) => a + v }
于 2010-11-14T20:52:47.130 回答
5

这并不是您问题的真正答案,但我发现它在开始折叠时很有用,所以我还是会说!请注意,/:方法“别名”foldLeft可能更清晰,原因有两个:

xs.foldLeft(y) { (yy, x) => /* ... */ }

(y /: xs) { (yy, x) => /* ... */ }

请注意,在第二行中:

  • 更清楚的是价值y折叠到集合中xs
  • 您可以轻松记住Tuple2参数的顺序与方法“调用”的顺序相同
于 2010-11-14T19:55:00.527 回答