Scala foldLeft在地图上

Pen*_*gin 33 scala scala-2.8 scala-collections

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

foldLeft [B] (z: B)(op: (B, (A, B)) ? B) : B
Run Code Online (Sandbox Code Playgroud)

但我遇到了困难:

Map("first"->1,"second"->2).foldLeft(0)((a,(k,v)) => a+v )
Run Code Online (Sandbox Code Playgroud)

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

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

Deb*_*ski 79

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

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

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

  • 为什么需要模式匹配?是否有其他模式可以在 FoldLeft 中匹配? (2认同)

Tho*_*ung 17

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

Map("first"->1,"second"->2).foldLeft(0)((a, t) => a + t._2)
Run Code Online (Sandbox Code Playgroud)

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

Map("first"->1,"second"->2).values.sum
Run Code Online (Sandbox Code Playgroud)

  • 他_can_模式匹配元组.但是,为了模式匹配,需要使用`case`. (6认同)

The*_*heo 6

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

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


oxb*_*kes 5

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

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

(y /: xs) { (yy, x) => /* ... */ }
Run Code Online (Sandbox Code Playgroud)

请注意,在第二行:

  • 更清楚的是,价值y折叠到集合中xs
  • 你可以很容易地记住Tuple2参数的顺序与方法"call"的顺序相同