इस आपरेशन अक्सर अनुक्रमण कहा जाता है, और कुछ कार्यात्मक भाषाओं (जैसे हास्केल के रूप में) के मानक पुस्तकालयों में उपलब्ध है। स्कैला में आप या तो अपना खुद का कार्यान्वयन कर सकते हैं, या बाहरी पुस्तकालय का उपयोग कर सकते हैं जैसे Scalaz। मान लीजिए कि हमें निम्नलिखित है, उदाहरण के लिए:
val xs: List[Either[String, Int]] = List(Right(1), Right(2))
val ys: List[Either[String, Int]] = List(Right(1), Left("1st!"), Left("2nd!"))
अब हम (Scalaz 7 का उपयोग कर) लिख सकते हैं:
scala> import scalaz._, Scalaz._
import scalaz._
import Scalaz._
scala> xs.sequenceU
res0: Either[String,List[Int]] = Right(List(1, 2))
scala> ys.sequenceU
res1: Either[String,List[Int]] = Left(1st!)
के रूप में वांछित।
एक तरफ ध्यान दें के रूप में, इस आपरेशन सिर्फ इतना है कि बाहर कंटेनर traversable हो की आवश्यकता है और अंदर कंटेनर एक अनुप्रयोगी functor हो कि। Scalaz भी एक ValidationNEL
वर्ग कि Either
की तरह एक बहुत कुछ है और इन आवश्यकताओं का भी फिट बैठता है प्रदान करता है, लेकिन ValidationNEL
रों की एक सूची पर sequence
उपयोग करने के बजाय पहली बार में रोक के कई त्रुटियों एकत्र करता है:
val zs: List[ValidationNEL[String, Int]] =
List(1.successNel, "1st".failNel, "2nd".failNel)
अब हम पाते हैं:
scala> print(zs.sequenceU)
Failure(NonEmptyList(1st, 2nd))
तुम भी Option
रों, Promise
रों की एक सूची पर sequence
इस्तेमाल कर सकते हैं, आदि
स्रोत
2012-10-28 21:48:57
परिवर्तन हासिल करना चाहते हैं थोड़ा अस्पष्ट है। आपकी इनपुट सूची में 'राइट [स्ट्रिंग]' के आधा और विभिन्न और विषम 'बाएं [अपवाद] के आधे उदाहरण हैं। आप इसे किसी एक अपवाद या तारों की सूची में कम करना चाहते हैं। यदि उदाहरण थे तो कौन सा अपवाद लिया जाना चाहिए इनपुट में दस अलग? –
आप सही हैं। मैं केवल पहला अपवाद (या कोई वाम मूल्य) पर विचार करना चाहता हूं, यह अन्य को छिपाएगा लेकिन यह मेरे उपयोग के मामले के लिए स्वीकार्य है। –
यह http://stackoverflow.com/questions/7230999/how-to-reduce-a-seqeithera-b-to-a-eitherseqa-seqb का डुप्लिकेट है। – ziggystar