स्कलाज़ में एक सेमीग्रुप की अवधारणा है, जो आप यहाँ क्या करना चाहते हैं, कैप्चर करता है, और यकीनन सबसे छोटा / स्वच्छ समाधान निकलता है:
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
किसी भी डुप्लिकेट मान से अधिक सेमीग्रुप ऑपरेटर को तह करता है। Int
अतिरिक्त ऑपरेटर के लिए मानक सेमीग्रुप का उपयोग होता है, इसलिए आपको प्रत्येक डुप्लिकेट कुंजी के लिए मानों का योग मिलता है।
संपादित करें : user482745 के अनुरोध के अनुसार थोड़ा और विस्तार।
गणितीय रूप से एक सेमीग्रुप केवल मानों का एक समूह है, साथ में एक ऑपरेटर जो उस सेट से दो मान लेता है, और उस सेट के लिए एक और मान पैदा करता है। तो इसके अलावा पूर्णांक एक अर्धवृत्त है, उदाहरण के लिए - +
ऑपरेटर एक और इंट बनाने के लिए दो इनट्स को जोड़ता है।
आप "किसी दिए गए कुंजी प्रकार और मूल्य प्रकार के साथ सभी मानचित्र" के सेट पर एक उपसमूह को भी परिभाषित कर सकते हैं, इसलिए जब तक आप कुछ ऑपरेशन के साथ आ सकते हैं जो दो नक्शों को मिलाकर एक नया निर्माण करता है जो किसी भी तरह दो का संयोजन है आदानों।
यदि कोई कुंजी नहीं है जो दोनों मानचित्रों में दिखाई देती है, तो यह तुच्छ है। यदि एक ही कुंजी दोनों मानचित्रों में मौजूद है, तो हमें उन दो मूल्यों को संयोजित करने की आवश्यकता है, जिनके लिए मुख्य मानचित्र हैं। हम्म, क्या हमने सिर्फ एक ऑपरेटर का वर्णन नहीं किया है जो एक ही प्रकार की दो संस्थाओं को जोड़ती है? यही कारण है कि स्केलाज़ में एक सेमीग्रुप Map[K, V]
मौजूद है अगर और केवल एक सेमीग्रुप V
मौजूद है -V
'एस का उपयोग दो मानचित्रों से मानों को संयोजित करने के लिए किया जाता है जो एक ही कुंजी को सौंपे जाते हैं।
इसलिए क्योंकि Int
यहाँ मूल्य प्रकार है, 1
कुंजी पर "टकराव" दो मैप किए गए मानों के पूर्णांक जोड़ द्वारा हल किया जाता है (जैसा कि इंट का सेमीग्रुप ऑपरेटर करता है), इसलिए100 + 9
। यदि मान स्ट्रिंग्स थे, तो एक टकराव के परिणामस्वरूप दो मैप किए गए मानों को फिर से जोड़ा जा सकता था (क्योंकि, स्ट्रिंग के लिए अर्धचालक ऑपरेटर यही करता है)।
(और दिलचस्प बात यह है कि, क्योंकि स्ट्रिंग कॉन्फैटिनेशन कम्यूटेटिव नहीं है - अर्थात, "a" + "b" != "b" + "a"
परिणामी सेमीग्राफ ऑपरेशन या तो नहीं है। इसलिए स्ट्रिंग मामले में map1 |+| map2
अलग है map2 |+| map1
, लेकिन इंट केस में नहीं।)
map1 ++ map2