2011-07-23 3 views
5

मैं अपने खुद के सामान्य map समारोह लिखने के लिए और कोशिश कर रहा हूँ कि मैं क्या निम्नलिखित के साथ आए हैं है रों। मुझे क्या परिवर्तन करना चाहिए ताकि यह Map एस के साथ भी काम करे?मेरे अपने सामान्य नक्शा functioni लेखन

उत्तर

3

निम्नलिखित कोड मेरे लिए काम करता है। मुझे लगता है कि अपने 'map' समारोह बस के रूप में 'मानचित्र # नक्शा()' उसी तरह काम

object App { 
    def main(args: Array[String]) { 
     val map1 = Map(1 -> "x", 2 -> "y") 
     println(map1.map(_._2)) 
     println(map(map1)(_._2)) 
    } 
    def map[A, B, CC[X] <: Traversable[X], That](xs: CC[A])(f: A => B)(implicit cbf: CanBuildFrom[CC[_], B, That]): That = { 
     val b = cbf(xs) 
     for (a <- xs) 
      b += f(a) 
     b.result 
    } 
} 

उत्पादन सूची (एक्स, वाई) है

5

आपका कोड संकलित करता है तथा ठीक (नोट चलाता है: मैं जब Map रों पर लागू किया स्काला 2.9.0.1 उपयोग कर रहा हूँ। आप स्काला के किस संस्करण का उपयोग कर रहे हैं उल्लेख करने के लिए चाहते हो सकता है।)

हालांकि अपने map समारोह हमेशा एक List रिटर्न तब भी जब यह एक Map ही वापस जाने के लिए समझ में आता है। आप CC[_] से CC बदलकर इससे बच सकते हैं।

def map[A, B, CC <: Traversable[A], That] 
     (xs: CC)(f: A => B) 
     (implicit cbf: CanBuildFrom[CC, B, That]): That = { 
    val b = cbf(xs) 
    for (a <- xs) 
    b += f(a) 
    b.result 
} 

लेकिन आप जब यह लागू है, जो एक सा दुख की बात है स्पष्ट रूप से इस समारोह टाइप-टिप्पणी करने की जरूरत है: (संबंधित ब्लॉग पोस्ट A Generic Quicksort in Scala।)।

val xs = Map(45 -> 32, 11 -> 9) 
map[(Int, Int), (Int, Int), Map[Int, Int], Map[Int, Int]](Map(45 -> 32, 11 -> 9))(identity) 
// gives Map(45 -> 32, 11 -> 9) 

इस बदसूरत प्रकार की एनोटेशन से बचने के लिए कुछ तरीका होना चाहिए, लेकिन मुझे इसके बारे में पता नहीं है।

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