2012-12-20 14 views
13

एक सरल विकल्प के साथ पाश के लिए एक का उपयोग करते हुए काम करता है: जब तक विकल्प स्पष्ट रूप से एक सूची में बदल जाती हैविकल्प को loops के लिए अंदर स्पष्ट करने की आवश्यकता क्यों है?

scala> for (lst <- Some(List(1,2,3)); x <- lst) yield x 
<console>:8: error: type mismatch; 
found : List[Int] 
required: Option[?] 
       for (lst <- Some(List(1,2,3)); x <- lst) yield x 
              ^

...:

scala> for (lst <- Some(List(1,2,3))) yield lst 
res68: Option[List[Int]] = Some(List(1, 2, 3)) 

लेकिन विकल्प की सामग्री पर पाशन नहीं करता है:

scala> for (lst <- Some(List(1,2,3)).toList; x <- lst) yield x 
res66: List[Int] = List(1, 2, 3) 

स्पष्ट सूची रूपांतरण की आवश्यकता क्यों है? क्या यह मूर्खतापूर्ण समाधान है?

उत्तर

12
for (lst <- Some(List(1,2,3)); x <- lst) yield x 

Some(List(1,2,3)).flatMap(lst => lst.map(x => x)) 

लिए अनुवाद किया है Option पर flatMap विधि एक समारोह है कि एक Option रिटर्न की उम्मीद है, लेकिन आप एक समारोह है कि एक List रिटर्न गुजर रहे हैं और वहां के List से कोई अंतर्निहित रूपांतरण है Option

अब आप जो है जो आप इसे करने के लिए गुजर रहे एक List फ़ंक्शन, उम्मीद है एक सूची पहले List की flatMap विधि के बजाय कहा जाएगा, करने के लिए Option परिवर्तित करता है, तो।

इस विशेष मामले में, मुझे लगता है कि सबसे मुहावरेदार समाधान

Some(List(1,2,3)).flatten.toList 
+0

यही वजह है कि '(lst <के लिए है - कुछ (सूची (1,2,3)) मिलता है, x <- विकल्प (lst)) उपज x' भी काम करता है। दिलचस्प। – sberry

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