【问题标题】:Scala foldLeft on Maps地图上的 Scala foldLeft
【发布时间】:2011-05-09 21:16:48
【问题描述】:

您如何使用 Map.foldLeft?根据docs 看起来像

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

但我遇到了困难:

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

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

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

【问题讨论】:

    标签: scala scala-2.8 scala-collections


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

      注意第二行:

      • 更清楚的是y 的值被折叠到集合xs
      • 您可以轻松记住Tuple2 参数的顺序与方法“调用”的顺序相同

      【讨论】:

        【解决方案3】:

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

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

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

        【讨论】:

        • 为什么需要模式匹配?是否有任何其他模式可以在 foldLeft 中匹配?
        【解决方案4】:

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

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

        其实用values和sum比较简单。

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

        【讨论】:

        • 可以在元组上进行模式匹配。但是,要进行模式匹配,需要使用case
        • @Daniel 这就是我的律师式句子的优点:它是正确的(他无法按预期进行模式匹配)但我忘记了 case 语法。
        • 对于这样的问题,使用valuesmapValues 绝对是最清晰的解决方案(这几乎总是正确的选择)
        猜你喜欢
        • 1970-01-01
        • 2019-02-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多