使用scala映射累积值

使用scala映射累积值,scala,scalaz,Scala,Scalaz,可能重复: 我有一堆类型为Map[String,Int]的映射。我想能够合并他们采取的价值观的总和时,键对应。例如,地图上的标准++方法 Map("a" -> 1, "b" -> 2) ++ Map("a" -> 3, "c" -> 5) // Map[String,Int] = Map(a -> 3, b -> 2, c -> 5) 我想定义一个操作,其结果是 Map("a" -> 1, "b" -> 2) ?? Map("a" -&g

可能重复:

我有一堆类型为
Map[String,Int]
的映射。我想能够合并他们采取的价值观的总和时,键对应。例如,地图上的标准
++
方法

Map("a" -> 1, "b" -> 2) ++ Map("a" -> 3, "c" -> 5)
// Map[String,Int] = Map(a -> 3, b -> 2, c -> 5)
我想定义一个操作,其结果是

Map("a" -> 1, "b" -> 2) ?? Map("a" -> 3, "c" -> 5)
// Map[String,Int] = Map(a -> 4, b -> 2, c -> 5)
在花哨的措辞中,
Map[A,B]
总是有一个幺半群的自然结构,但是当
B
本身是一个幺半群时,就有一个不同的结构

> Map("a" -> 1, "b" -> 2) |+| Map("a" -> 3, "c" -> 5)
  Map("a" -> 4, "c" -> 5, "b" -> 2)

现在,为
LinkedHashMap
编写递归实现并不困难,但我认为一定有一些简单且更通用的方法来编写它,可能使用scalaz。有什么想法吗?

看起来您实际上是在尝试将
地图
用作
多集
。对于multiset,您描述的操作只是multiset sum
s1⊎ s2

不幸的是,但是

对于Scala中假设的
Multiset

Multiset("a", "b", "b") ++ Multiset("a", "a", "a", "c", "c", "c", "c", "c")
// Multiset[String] = Multiset("a" -> 4, "b" -> 2, "c" -> 5)

如果Map[a,B]也是幺半群,Scalaz就有一个幺半群实例

> Map("a" -> 1, "b" -> 2) |+| Map("a" -> 3, "c" -> 5)
  Map("a" -> 4, "c" -> 5, "b" -> 2)

Scalaz有很多方法可以做到这一点,但令人遗憾的是,我们在Collections API中的
Map
上没有一个
unionWith
方法。我从未完全理解Multiset的术语选择。它们构成了成分的直方图,为什么不称之为直方图呢?