使用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 sums1⊎ 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的术语选择。它们构成了成分的直方图,为什么不称之为直方图呢?