2015-05-15 6 views
5

हास्केल में, वहाँ एक समारोह fromListWith जो एक समारोह से एक मानचित्र उत्पन्न कर सकते हैं कहा जाता है और एक सूची (एक ही कुंजी के साथ मूल्यों विलय करने के लिए प्रयोग किया जाता है):स्कैला में, क्या मानचित्र के लिए हैस्केल के "सेलिस्टविथ" के बराबर है?

fromListWith :: Ord k => (a -> a -> a) -> [(k, a)] -> Map k a 

निम्नलिखित अभिव्यक्ति true लिए मूल्यांकन किया जाएगा:

fromListWith (++) [(5,"a"), (5,"b"), (3,"b"), (3,"a"), (5,"a")] == fromList [(3, "ab"), (5, "aba")] 

स्काला में, वहाँ एक समान कार्य List वस्तुओं, जो भी एक मानचित्र के लिए एक सूची में बदल सकते हैं पर toMap कहा जाता है, लेकिन यह समारोह की एक पैरामीटर डुप्लीकेट कुंजियों से निपटने के लिए नहीं हो सकता।

क्या किसी के पास इसके बारे में कोई विचार है?

उत्तर

8

अलावा आप भी एक अपने आप निर्धारित कर सकते हैं:

scala> val testList = List((5,"a"), (5,"b"), (3,"b"), (3,"a"), (5,"a")) 
scala> testList toMapWith (_ + _) 
res1: scala.collection.immutable.Map[Int,String] = Map(5 -> aba, 3 -> ba) 
+0

के बारे में कुछ इसी तरह लिखने के लिए दिया गया है:

implicit class ListToMapWith[K, V](list: List[(K, V)]) { def toMapWith(op: (V, V) => V) = list groupBy (_._1) mapValues (_ map (_._2) reduce op) } 

यहाँ एक के उपयोग का उदाहरण है। मुझे सिखाए जाने के लिए +1 कि 'mapValues' मौजूद है। –

+2

ध्यान दें कि 'mapValues' एक दृश्य देता है जो प्रत्येक पहुंच पर मूल्य का पुनर्मूल्यांकन करेगा, जो इस मामले में वांछनीय नहीं हो सकता है। –

3

stdlib में ऐसी सुविधा नहीं है, हालांकि, Data.Map का एक बंदरगाह scalaz में उपलब्ध है जो does have यह फ़ंक्शन उपलब्ध है। scalaz का उपयोग करने से

संबंधित मुद्दे