Die übliche Art und Weise mit einer Liste von Validierungen zu arbeiten, ist sequence
zu verwenden, um die Liste in eine Validation[A, List[B]]
zu drehen, die leer sein wird (das heißt ein Failure
), ob es irgendwelche Fehler auf dem Weg waren.
Die Sequenzierung einer Validation
akkumuliert Fehler (im Gegensatz zu Either
, die sofort fehlschlägt) in der Halbgruppe des linken Typs. Deshalb sehen Sie oft ValidationNEL
(wobei NEL
für NonEmptyList
steht) anstelle von einfach Validation
verwendet. So zum Beispiel, wenn Sie dieses Ergebnis Typ:
import scalaz._, Scalaz._
type ExceptionsOr[A] = ValidationNEL[Exception, A]
Und einige Ergebnisse:
val results: Seq[ExceptionsOr[Int]] = Seq(
"13".parseInt.liftFailNel, "42".parseInt.liftFailNel
)
Sequenzierung wird Ihnen folgendes:
scala> results.sequence
res0: ExceptionsOr[Seq[Int]] = Success(List(13, 42))
Wenn wir einige Fehler wie diese hatte, auf der anderen Seite:
val results: Seq[ExceptionsOr[Int]] = Seq(
"13".parseInt.liftFailNel, "a".parseInt.liftFailNel, "b".parseInt.liftFailNel
)
Wir würden mit einem Failure
(beachten Sie, dass ich die Ausgabe neu formatiert haben, um es hier lesbar zu machen) am Ende:
scala> results.sequence
res1: ExceptionsOr[Seq[Int]] = Failure(
NonEmptyList(
java.lang.NumberFormatException: For input string: "a",
java.lang.NumberFormatException: For input string: "b"
)
)
Also in Ihrem Fall, dass Sie so etwas schreiben würden:
val results: Seq[ValidationNEL[A, B]]
results.sequence match {
case Success(xs) => xs.foreach(_.push); containers.foreach(_.start())
case Failure(exceptions) => exceptions.foreach(
logger.error("Error when starting up ccxy gottware", _)
)
}
Siehe meine Antworten here und here für mehr Details über sequence
und über Validation
allgemeiner.
Was ist mit dem komplementären Fall? Ich möchte Erfolg haben, wenn mindestens eine Validierung erfolgreich war? – Edmondo1984
Das hört sich so an, als ob Sie gegen die "Validation" arbeiten. In 7 könntest du die Liste mit '|||' reduzieren, aber in 6 brauchst du etwas wie die Summe mit der Halbgruppe für die rechte Projektion von 'Entweder' (oder du könntest dein eigenes' ||| 'schreiben). –
Können Sie mich auf einige Ressourcen hinweisen, die erklären, was eine Semigroup ist? – Edmondo1984