【问题标题】:How to convert a fold left operator ":/" into the foldLeft function in scala?如何将左折叠运算符“:/”转换为scala中的foldLeft函数?
【发布时间】:2019-09-10 12:23:18
【问题描述】:

以下代码将两个映射的值相加成一个映射。

val merged = (map1 /: map2) { case (map, (k,v)) =>
    map + ( k -> (v + map.getOrElse(k, 0)) )
}

但是,我无法使用 foldLeft()() 函数对其进行转换。 这是我尝试过的,但无法取得有意义的进展。

val merged2 =  map2 foldLeft (map1) ((acc:Map[Int,Int], (k:Int,v:Int)) =>   acc + ( k -> (v + acc.getOrElse(k, 0)) ))

使用 foldLeft 函数重写的正确方法是什么?

【问题讨论】:

  • 我建议你使用 scalaz 添加两张地图
  • 嗨@RamanMishra,谢谢小费!我刚刚开始使用 scala

标签: scala foldleft


【解决方案1】:

你差点就吃完了:

val merged2 = map2.foldLeft(map1) { case (acc, (k,v)) =>  acc + (k -> (v + acc.getOrElse(k, 0))) }

【讨论】:

  • 您能否详细说明我的版本缺少什么?你为什么使用“案例”?此外,一般而言,您应该如何处理使用模式匹配的 foldLeft 用例,即需要使用 case 语法?
  • 这与 OP 的版本有何不同?除了 {} 大括号
  • @RamanMishra op 的版本有编译错误,sachav 也添加了一个案例以及 {},但我不确定为什么我的版本是错误的,即使我按照 foldLeft 规范提供了正确的功能
  • @DevA 问题在于(a: Int, b: Int) => ??? 是一个接受两个Int 参数的函数,而不是一个接受一个元组(Int, Int) 的函数。使用{}case 将参数转换为具有单个参数的部分函数,​​然后case 语句使用模式匹配对元组进行解构。
猜你喜欢
  • 1970-01-01
  • 2017-04-11
  • 2016-03-26
  • 1970-01-01
  • 1970-01-01
  • 2014-10-08
  • 1970-01-01
  • 1970-01-01
  • 2011-01-18
相关资源
最近更新 更多