2012-10-04 6 views
6

असल में मैं विकल्प ए, बी इत्यादि का एक गुच्छा निकालना चाहता हूं। क्या यह स्कैला में ऐसा करने का सबसे अच्छा तरीका है? यह मुझे संश्लेषण में उपज प्राप्त करने के लिए भ्रमित लग रहा है।उपज के लिए है-getErElse paradigmatic scala या क्या कोई बेहतर तरीका है?

(for { 
    a <- a 
    b <- b 
    c <- c 
    ... 
} yield { 
    ... 
}) getOrElse { 
    ... 
} 
+2

ऐसा लगता है कि आप * कोर * स्कैला के साथ इससे बेहतर नहीं होंगे, लेकिन संभवतः आप [स्केलज़ के लिए प्रयास करें] (http://www.casualmiracles.com/2012/01/16/a-small -example के- अनुप्रयोगी-functors-साथ-scalaz /)? –

+0

स्कालज़ उदाहरण वास्तव में इस परिदृश्य से निपटता नहीं है बल्कि इसके बजाय 3 स्वतंत्र विकल्प; यहां प्रश्न नेस्टेड विकल्पों के बारे में है; क्या मैं कुछ भूल रहा हूँ? –

+0

मुझे नहीं लगता कि माता-पिता में लिपटे समझ के साथ कुछ भी गलत है, यह किसी अन्य की तरह अभिव्यक्ति है। मुझे हर व़क्त यह करना है। –

उत्तर

6

बजाय map और flatMap का उपयोग करें। मान लें आप निम्नलिखित वर्ग पदानुक्रम है:

case class C(x: Int) 
case class B(c: Option[C]) 
case class A(b: Option[B]) 

val a = Some(A(Some(B(Some(C(42)))))) 

आदेश निकालने के लिए में 42 आप कह सकते हैं: को छोड़कर वापस करती है कि Some(42)

for(
    a <- a 
    b <- a.b 
    c <- b.c) 
     yield c.x 

:

a.flatMap(_.b).flatMap(_.c).map(_.x).getOrElse(-1) 

यह मोटे तौर पर के बराबर है। वास्तव में for समझ वास्तव में map/flatMap कॉल के अनुक्रम में अनुवादित है।

+0

तो फ्लैटमैप्स/मानचित्रों की एक श्रृंखला होगी? (गारेट ने लिखा '...' तो मुझे लगता है कि दो से अधिक विकल्प होंगे) –

+0

सी, डी, इत्यादि के बारे में क्या? और क्या लकवा है, अगर स्कैला में ऐसी चीज है? –

+0

@ ओम-नाम-नाम: मैंने स्पष्ट रूप से इंगित करने के लिए मेरे उदाहरण को दोबारा सुधार दिया कि चेनिंग कैसे कार्यान्वित की जाती है। –

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

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