का उपयोग करके सूची के विकल्प में विकल्पों की एक सूची में कनवर्ट करें मैं List[Option[T]]
को Option[List[T]]
में बदलना चाहता हूं। समारोह के हस्ताक्षर प्रकारस्कालज़
def lo2ol[T](lo: List[Option[T]]): Option[List[T]]
अपेक्षित व्यवहार एक सूची है कि तत्वों Some
के अंदर तत्वों की सूची से युक्त एक Some
में केवल Some
रों में मैप करने के लिए है। दूसरी तरफ, यदि इनपुट सूची में कम से कम एक None
है, तो अपेक्षित व्यवहार केवल None
वापस करना है। उदाहरण के लिए:
scala> lo2ol(Some(1) :: Some(2) :: Nil)
res10: Option[List[Int]] = Some(List(1, 2))
scala> lo2ol(Some(1) :: None :: Some(2) :: Nil)
res11: Option[List[Int]] = None
scala> lo2ol(Nil : List[Option[Int]])
res12: Option[List[Int]] = Some(List())
एक उदाहरण कार्यान्वयन, scalaz बिना, होगा:
def lo2ol[T](lo: List[Option[T]]): Option[List[T]] = {
lo.foldRight[Option[List[T]]](Some(Nil)){(o, ol) => (o, ol) match {
case (Some(x), Some(xs)) => Some(x :: xs);
case _ => None : Option[List[T]];
}}}
मैंने कहीं एक ऐसी ही उदाहरण देखकर याद है, लेकिन Scalaz का उपयोग कर कोड को आसान बनाने के। यह कैसा दिखता है?
एक से थोड़ा अधिक संक्षिप्त संस्करण, Scala2.8 PartialFunction.condOpt
का उपयोग कर, लेकिन अभी भी Scalaz बिना:
import PartialFunction._
def lo2ol[T](lo: List[Option[T]]): Option[List[T]] = {
lo.foldRight[Option[List[T]]](Some(Nil)){(o, ol) => condOpt(o, ol) {
case (Some(x), Some(xs)) => x :: xs
}
}}
लेकिन यदि आप 'सूची [विकल्प [ए]]' के 'कुछ' मान चाहते हैं, तो आपको अब 'विकल्प' की आवश्यकता नहीं है। आपके पास या तो एक खाली सूची या 'ए' की एक nonempty सूची होगी। – Apocalisp
वास्तव में, यदि कोई भी तत्व 'कोई नहीं' है, तो मैं 'कोई नहीं' प्राप्त करना चाहता हूं, इसलिए 'अनुक्रम' वही है जो मैंने पूछा था। मैं आवश्यकता को स्पष्ट करने के लिए प्रश्न को संपादित करने का प्रयास करूंगा। –
मुझे काम करने के लिए 'lo.sequence' नहीं मिल सकता है। स्कैला-2.8.0. बीटा 1 और स्केलज़-कोर_2.8.0.टाटा 1-5.0.1-SNAPSHOT.jar का उपयोग करना, अगर मैं 'def lo2ol [टी] दर्ज करता हूं (लो: सूची [विकल्प [टी]]): विकल्प [सूची [ टी]] = lo.sequence', मुझे ': 10: त्रुटि: प्रकार scalaz के लिए निहित विस्तार अलग करना। आवेदनक [एन]' –