2

根据这个问题:

合并两个地图并对相同键的值求和的最佳方法?

我需要使用 scalaz 来获得我想要的东西,但是我很好奇是否有人知道为什么下面的内容不能按我的预期工作?

Map(1->2.0)+(1->1.0)     //Map(1->1.0)

我希望这会导致 Map(1->3.0). 但是,地图似乎只返回最后一个键,如下所示:

Map(1->1.0, 1->3.0)     //Map(1->3.0)

所以,根据文档

将两个或更多元素添加到此集合并返回一个新集合。

以上,我的猜测是地图可能会存储值,但只返回最后一项?这不是我对 add 应该做什么的直觉......也许这是一种提高效率的举措。

一旦我有更多的时间,我会看一下代码并尝试从那里弄清楚,但想在这里问一下,以防有人已经知道?

4

2 回答 2

6

它与效率无关;它正在打字。 Mapplus 元素返回兼容类型的映射。你不知道类型,所以你不能知道添加数字。您可以改为列出它们,但Seq(2.0,1.0)不是2.0. 所以你最终会得到一个 to 的映射Any,这在保持你的类型正确时根本没有帮助你,而且你没有任何办法用另一个替换现有元素。

因此,+如果键不存在则添加新元素,如果键存在则替换现有元素。(不过,文档应该这样说。)

如果您想要“其他”行为,则需要更复杂的转换,这就是 Scalaz'|+|将为您做的自然添加元素

于 2013-05-08T21:37:19.307 回答
1

@RexKerr 的回答是完全正确的,但我认为并没有强调这里的关键误解。

对手段的+操作- 它将一个新的键/值对放入映射中(可能替换该键的现有对)。它与加法没有任何关系(雷克斯的回答进一步解释了它不一定与加法有任何关系)。您似乎来自 C# 背景,因此您应该想到:Mapput

myMap + (1, 1.0)

作为存在

myMap[1] = 1.0

插入新键/值对的能力是 Map/Dictionary 数据类型的基本操作。您想要编码的能力远不那么基本(以及更通用的按键合并地图能力的特殊情况,如您引用的问题和此处所述)。

于 2013-05-09T12:51:27.417 回答