Dieser Vorgang oft Sequenzierung genannt wird, und ist in den Standardbibliotheken einiger funktionaler Sprachen (wie Haskell) zur Verfügung. In Scala können Sie entweder eigene implementieren oder eine externe Bibliothek wie Scalaz verwenden. Angenommen, wir haben die folgende, zum Beispiel:
val xs: List[Either[String, Int]] = List(Right(1), Right(2))
val ys: List[Either[String, Int]] = List(Right(1), Left("1st!"), Left("2nd!"))
Jetzt können wir schreiben (mit 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!)
nach Wunsch.
Als Randbemerkung, diese Operation erfordert nur, dass der Außenbehälter überfahrbar sein und dass der Innenbehälter ein applicative Funktors sein. Scalaz bietet auch eine ValidationNEL
Klasse, die viel wie Either
ist und passt auch diese Anforderungen, sondern auf einer Liste von ValidationNEL
s sammelt sequence
unter Verwendung mehrerer Fehler stattdessen beim ersten Anhalten:
val zs: List[ValidationNEL[String, Int]] =
List(1.successNel, "1st".failNel, "2nd".failNel)
Jetzt erhalten wir:
scala> print(zs.sequenceU)
Failure(NonEmptyList(1st, 2nd))
Sie auch ein bisschen zweideutig verwenden könnte sequence
auf einer Liste von Option
s, Promise
s usw.
Die Transformation Sie erreichen wollen. Ihre Eingabeliste enthält zum Beispiel die Hälfte von 'Right [String]' s und die Hälfte von verschiedenen und heterogenen 'Left [Exception]' s. Sie möchten es auf eine Ausnahme oder eine Liste von Zeichenfolgen reduzieren. Welche Ausnahme sollte genommen werden, wenn z.B. zehn verschiedene in der Eingabe? –
Sie haben Recht. Ich möchte nur die erste Ausnahme (oder irgendeinen linken Wert) betrachten, die andere verbergen wird, aber es ist akzeptabel für meinen Anwendungsfall. –
Dies ist ein Duplikat von http://stackoverflow.com/questions/7230999/how-to-reduce-a-seqeithera-b-to-a-eitherseqa-seqb. – ziggystar