Scalaz bir kavramı vardır Yarıgrup tartışmasız en kısa / en temiz çözüm burada ne yapmak istediğini yakalar, ve başları:
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)
Özellikle, ikili operatör Map[K, V]
haritaların tuşlarını birleştirir, V
yarıgrup operatörünü yinelenen değerler üzerine katlar. İçin standart yarıgrup Int
toplama operatörünü kullanır, böylece her yinelenen anahtar için değerlerin toplamını alırsınız.
Düzenle : user482745'nin isteğine göre biraz daha fazla ayrıntı.
Matematiksel olarak bir yarıgrup , sadece bir değer kümesidir, bu kümeden iki değer alan ve bu kümeden başka bir değer üreten bir işleç ile birlikte. Eklenen tamsayılar bir yarıgruptur, örneğin - +
operatör başka bir int yapmak için iki int birleştirir.
"Belirli bir anahtar türüne ve değer türüne sahip tüm haritalar" kümesi üzerinde bir yarı grup tanımlayabilirsiniz, ancak iki haritayı bir şekilde birleştirerek, iki haritayı bir şekilde birleştirerek, iki haritayı bir araya getirebilirsiniz. girişleri.
Her iki haritada da görünen anahtar yoksa, bu önemsizdir. Her iki haritada da aynı anahtar varsa, anahtarın eşlendiği iki değeri birleştirmemiz gerekir. Hmm, aynı türden iki varlığı birleştiren bir operatör tanımladık mı? Scalaz içinde bir yarıgrubudur nedeni budur Map[K, V]
ancak ve ancak bir Yarıgrup için eğer varsa V
var - V
'ın yarıgrubudur aynı anahtar atanır iki harita değerleri birleştirmek için kullanılır.
Bu nedenle Int
burada değer türü olduğundan , 1
anahtardaki "çarpışma" iki eşlenen değerin tam olarak eklenmesi ile çözülür (Int'nin yarıgrup operatörünün yaptığı gibi) 100 + 9
. Değerler Dizeler olsaydı, bir çarpışma iki eşlenen değerin dize birleştirmesine neden olurdu (yine Dize için yarıgrup operatörünün yaptığı şey budur).
(Ve ilginç bir şekilde, dize birleştirmesi değişmeli olmadığından - yani, "a" + "b" != "b" + "a"
sonuçta ortaya çıkan semigroup işlemi de değil. Dize durumundakinden map1 |+| map2
farklı map2 |+| map1
, ancak Int durumunda değil.)
map1 ++ map2