2013-01-09 4 views

Antwort

9

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.

+0

Was ist mit dem komplementären Fall? Ich möchte Erfolg haben, wenn mindestens eine Validierung erfolgreich war? – Edmondo1984

+0

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). –

+0

Können Sie mich auf einige Ressourcen hinweisen, die erklären, was eine Semigroup ist? – Edmondo1984