Scalaz hat das Konzept einer Halbgruppe, die erfasst, was Sie hier tun möchten, und zu der wohl kürzesten / saubersten Lösung führt:
scala> import scalaz._
import scalaz._
scala> import Scalaz._
import Scalaz._
scala> val map1 = Map(1 -> 9 , 2 -> 20)
map1: scala.collection.immutable.Map[Int,Int] = Map(1 -> 9, 2 -> 20)
scala> val map2 = Map(1 -> 100, 3 -> 300)
map2: scala.collection.immutable.Map[Int,Int] = Map(1 -> 100, 3 -> 300)
scala> map1 |+| map2
res2: scala.collection.immutable.Map[Int,Int] = Map(1 -> 109, 3 -> 300, 2 -> 20)
Insbesondere Map[K, V]
kombiniert der Binäroperator für die Schlüssel der Karten und faltet V
den Halbgruppenoperator über alle doppelten Werte. Die Standard-Halbgruppe für Int
verwendet den Additionsoperator, sodass Sie die Summe der Werte für jeden doppelten Schlüssel erhalten.
Bearbeiten : Etwas detaillierter gemäß der Anfrage von user482745.
Mathematisch a Halbgruppe nur eine Menge von Werten, zusammen mit einem Operator, der zwei Werte aus dieser Menge nimmt und einen anderen Wert aus dieser Menge erzeugt. So sind +
hinzugefügte Ganzzahlen beispielsweise eine Halbgruppe - der Operator kombiniert zwei Ints, um ein weiteres Int zu erstellen.
Sie können auch eine Halbgruppe über der Menge "Alle Karten mit einem bestimmten Schlüsseltyp und Werttyp" definieren, sofern Sie eine Operation entwickeln können, bei der zwei Karten kombiniert werden, um eine neue zu erstellen, die irgendwie die Kombination der beiden ist Eingänge.
Wenn in beiden Karten keine Schlüssel vorhanden sind, ist dies trivial. Wenn in beiden Karten derselbe Schlüssel vorhanden ist, müssen wir die beiden Werte kombinieren, denen der Schlüssel zugeordnet ist. Hmm, haben wir nicht gerade einen Operator beschrieben, der zwei Entitäten desselben Typs kombiniert? Deshalb in Scalaz eine Halbgruppe fürMap[K, V]
genau dann, wenn eine Halbgruppe für V
existiert - V
die Halbgruppe wird verwendet, um die Werte aus zwei Karten zu kombinieren, die demselben Schlüssel zugeordnet sind.
Also, weil Int
hier der Werttyp ist, die "Kollision" auf dem1
Schlüssel durch ganzzahlige Addition der beiden zugeordneten Werte aufgelöst (wie dies der Halbgruppenoperator von Int tut) 100 + 9
. Wenn die Werte Strings gewesen wären, hätte eine Kollision zu einer Verkettung der beiden zugeordneten Werte geführt (wiederum, weil dies der Halbgruppenoperator für String tut).
(Und interessanterweise, weil die Verkettung von Zeichenfolgen nicht kommutativ ist - das heißt, "a" + "b" != "b" + "a"
- die resultierende Halbgruppenoperation auch nicht. Sie map1 |+| map2
unterscheidet sich also von map2 |+| map1
der Zeichenfolge , aber nicht von Int.)
map1 ++ map2