2009-11-25 1 views
58

अगर मैं एक List[Option[A]] की तरह कुछ है और मैं एक List[A] में इस परिवर्तित करना चाहते हैं, मानक तरीका flatMap उपयोग करने के लिए है:क्या कोई स्केल पहचान फ़ंक्शन है?

scala> val l = List(Some("Hello"), None, Some("World")) 
l: List[Option[java.lang.String]] = List(Some(Hello), None, Some(World)) 

scala> l.flatMap(o => o) 
res0: List[java.lang.String] = List(Hello, World) 

अब o => o सिर्फ एक पहचान कार्य है। मैं सोचा होगा कुछ तरीके से करना वहाँ होगा:

l.flatMap(Identity) //return a List[String] 

हालांकि, मैं इस के रूप में आप एक object generify नहीं कर सकते हैं काम करने के लिए नहीं मिल सकता है। मैंने कुछ चीजों का कोई फायदा नहीं लिया; क्या किसी को इस तरह काम करने के लिए कुछ मिला है?

+2

मुझे लगता है कि चाहते हैं कि '{_}' समानता चाहिए करने के लिए '{x => x}' जैसे '{_ + 3}' '{x => x + 3}' के बराबर है। क्या कोई इस पर टिप्पणी कर सकता है कि ऐसा क्यों नहीं है? –

उत्तर

52

एक पहचान function in Predef है। expresion के लिए

l flatMap identity[Option[String]] 

> List[String] = List(Hello, World) 

एक अच्छे है, मुझे लगता है:

for(x <- l; y <- x) yield y 

संपादित करें:

मैं क्यों प्रकार पैरामीटर (विकल्प [स्ट्रिंग]) की जरूरत है यह पता लगाने की कोशिश की। समस्या विकल्प [टी] से Iterable [टी] के प्रकार रूपांतरण लगता है।

आप पहचान समारोह के रूप में परिभाषित करते हैं:

l.flatMap(x => Option.option2Iterable(identity(x))) 

प्रकार पैरामीटर छोड़ा जा सकता है।

+0

टाइप इनफ्रेंसर प्रकारों को स्वयं कैसे नहीं समझ सकता है? 'L.flatMap (पहचान) क्यों नहीं है: सूची [स्ट्रिंग] 'काम? –

+0

मैंने सोचा कि इन्फ्रेंसर इसे समझ सकता है। मुझे पता नहीं है। मैं एक प्रश्न जोड़ूंगा। :-) –

+1

@oxbow_lakes - संपादन देखें। यह अंतर्निहित प्रकार रूपांतरण से संबंधित है। –

21

एफडब्ल्यूआईडब्ल्यू, स्कैला 2.8 पर आप बस flatten पर कॉल करें। Thomas यह ज्यादातर स्कैला 2.7 के लिए कवर किया गया है।

l.flatMap[String](identity) 

यह ऑपरेटर अंकन साथ काम नहीं करेंगे, हालांकि (यह ऑपरेटर अंकन लगता प्रकार पैरामीटर है, जो पता करने के लिए अच्छा है स्वीकार नहीं करता है): वह केवल यह है कि पहचान का उपयोग कर में से एक वैकल्पिक तरीका याद किया।

आप भी स्काला 2.7 पर कॉल flatten (एक List पर, कम से कम), लेकिन यह नहीं एक प्रकार बिना कुछ भी नहीं कर सकेंगे कर सकते हैं। बहरहाल, यह काम करता है:

l.flatten[String] 
2

तुम बस थोड़ी सी मदद inferencer प्रकार दे सकता है:

scala> val l = List(Some("Hello"), None, Some("World")) 
l: List[Option[java.lang.String]] = List(Some(Hello), None, Some(World)) 

scala> l.flatten[String] 
res0: List[String] = List(Hello, World)