Zwykły sposób pracować z listą walidacji jest użycie sequence
włączyć listę do Validation[A, List[B]]
, które będą być pusty (tj Failure
) jeśli były jakieś błędy po drodze.
Sekwencjonowanie Validation
powoduje kumulację błędów (w przeciwieństwie do Either
, które nie powiedzie się natychmiast) w półgrupie typu lewej ręki. Dlatego często widzisz ValidationNEL
(gdzie NEL
oznacza NonEmptyList
) używane zamiast po prostu Validation
. Tak na przykład, jeśli masz tego typu wynik:
import scalaz._, Scalaz._
type ExceptionsOr[A] = ValidationNEL[Exception, A]
a niektóre wyniki:
val results: Seq[ExceptionsOr[Int]] = Seq(
"13".parseInt.liftFailNel, "42".parseInt.liftFailNel
)
Sekwencjonowanie daje następujące:
scala> results.sequence
res0: ExceptionsOr[Seq[Int]] = Success(List(13, 42))
Gdybyśmy mieli jakieś błędy jak ten, z drugiej strony:
val results: Seq[ExceptionsOr[Int]] = Seq(
"13".parseInt.liftFailNel, "a".parseInt.liftFailNel, "b".parseInt.liftFailNel
)
Chcemy skończyć z Failure
(zauważ, że mam przeformatowanym wyjście aby czytelne tutaj):
scala> results.sequence
res1: ExceptionsOr[Seq[Int]] = Failure(
NonEmptyList(
java.lang.NumberFormatException: For input string: "a",
java.lang.NumberFormatException: For input string: "b"
)
)
Więc w przypadku, gdy chcesz napisać coś takiego:
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", _)
)
}
Zobacz moje odpowiedzi here i here po więcej szczegółów na temat sequence
i około Validation
bardziej ogólnie.
Co powiecie na bezpłatną sprawę? Chcę odnieść sukces, jeśli udało się co najmniej walidację? – Edmondo1984
Wygląda na to, że możesz pracować przeciwko ziarnu "Walidacji". W 7 możesz zmniejszyć listę za pomocą '|||', ale w 6 będziesz potrzebował czegoś takiego jak suma używając półgrupy dla prawej projekcji 'Albo" (albo możesz napisać własną '|||'). –
Czy możesz wskazać mi jakieś zasoby, które wyjaśniają, czym jest półgrupa? – Edmondo1984