ScalazมีแนวคิดของSemigroupซึ่งรวบรวมสิ่งที่คุณต้องการทำที่นี่และนำไปสู่การแก้ปัญหาที่สั้นที่สุด / สะอาดที่สุด:
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)
โดยเฉพาะผู้ประกอบการไบนารีสำหรับMap[K, V]
รวมคีย์ของแผนที่V
ตัวดำเนินการ semigroup ของการพับทับค่าที่ซ้ำกันใด ๆ semigroup มาตรฐานสำหรับInt
ใช้ตัวดำเนินการเพิ่มดังนั้นคุณจะได้รับผลรวมของค่าสำหรับแต่ละคีย์ที่ซ้ำกัน
แก้ไข : รายละเอียดเพิ่มเติมเล็กน้อยตามคำขอของผู้ใช้ 482745
ศาสตร์semigroupเป็นเพียงชุดของค่าพร้อมกับผู้ประกอบการที่ใช้สองค่าจากชุดนั้นและสร้างอีกค่าจากชุดนั้น ดังนั้นจำนวนเต็มภายใต้การเพิ่มจึงเป็นกลุ่มตัวอย่างเช่น - +
ผู้ประกอบการรวมสอง int เพื่อสร้าง int อื่น
คุณยังสามารถกำหนด semigroup ได้มากกว่าชุดของ "แผนที่ทั้งหมดที่มีประเภทของคีย์และค่าที่กำหนด" ตราบใดที่คุณสามารถดำเนินการบางอย่างที่รวมสองแผนที่เพื่อสร้างแผนที่ใหม่ซึ่งเป็นการรวมกันของสองอย่างใด ปัจจัยการผลิต
หากไม่มีคีย์ที่ปรากฏในแผนที่ทั้งสองนี่เป็นเรื่องเล็กน้อย หากคีย์เดียวกันมีอยู่ในทั้งสองแผนที่เราต้องรวมค่าสองค่าที่คีย์แมปเข้าด้วยกัน อืมเราไม่ได้เพิ่งอธิบายผู้ประกอบการที่รวมสองหน่วยงานประเภทเดียวกันหรือไม่ นี่คือเหตุผลว่าทำไมใน Scalaz จึงมี semigroup สำหรับMap[K, V]
ถ้าหาก Semigroup สำหรับV
มีอยู่ - V
semigroup ของมีการใช้เพื่อรวมค่าจากแผนที่สองแผนที่ที่กำหนดให้กับคีย์เดียวกัน
ดังนั้นเพราะInt
เป็นค่าชนิดที่นี่ที่ "ชน" ที่1
สำคัญได้รับการแก้ไขโดยการเพิ่มจำนวนเต็มของค่าทั้งสองแมป (เป็นที่สิ่งที่ Int ของกึ่งกลุ่มผู้ประกอบการไม่) 100 + 9
จึง หากค่านั้นเป็น Strings การชนกันจะส่งผลให้มีการต่อสายอักขระของค่าที่แมปสองค่า (อีกครั้งเพราะนั่นคือสิ่งที่ตัวดำเนินการ semigroup สำหรับ String ทำ)
(และน่าสนใจเนื่องจากการต่อสตริงไม่ใช่การสลับ - นั่นคือ"a" + "b" != "b" + "a"
- การดำเนินการกลุ่ม semigroup ที่ได้นั้นไม่เหมือนกันดังนั้นจึงmap1 |+| map2
แตกต่างจากmap2 |+| map1
ในกรณี String แต่ไม่ใช่ในกรณี Int)
map1 ++ map2