検証リストを使用する通常の方法は、sequence
を使用してリストをValidation[A, List[B]]
にすることです。途中でエラーがあった場合は空になります(つまり、Failure
)。
シーケンシングa Validation
は、左手型のセミグループでエラーを累積します(Either
はすぐに失敗します)。このため、Validation
の代わりにValidationNEL
(NEL
はNonEmptyList
を表します)がよく使われます。
import scalaz._, Scalaz._
type ExceptionsOr[A] = ValidationNEL[Exception, A]
そして、いくつかの結果:あなたはこの結果型持っているのであれば、たとえば
val results: Seq[ExceptionsOr[Int]] = Seq(
"13".parseInt.liftFailNel, "42".parseInt.liftFailNel
)
を配列決定はあなたに以下を与える:
scala> results.sequence
res0: ExceptionsOr[Seq[Int]] = Success(List(13, 42))
私たちはこのようないくつかのエラーが発生した場合は、他方では:
val results: Seq[ExceptionsOr[Int]] = Seq(
"13".parseInt.liftFailNel, "a".parseInt.liftFailNel, "b".parseInt.liftFailNel
)
我々は(私はここでそれを読みやすくするために、出力をフォーマットを変更したことに注意してください)Failure
で終わるだろう:
scala> results.sequence
res1: ExceptionsOr[Seq[Int]] = Failure(
NonEmptyList(
java.lang.NumberFormatException: For input string: "a",
java.lang.NumberFormatException: For input string: "b"
)
)
だからあなたの場合には、あなたがこのような何か書きたい:
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", _)
)
}
を
sequence
および約Validation
の詳細については、hereおよびhereを参照してください。
無料の場合はどうですか?少なくとも検証が成功したら、成功したいですか? – Edmondo1984
あなたは 'Validation'の穀粒に対して働いているようです。 7ではリストを '|||'で減らすことができましたが、6では 'Either'の正しい射影のためにセミグルームを使った和のようなものが必要になります(あるいは独自の' ||| 'を書くこともできます)。 –
Semigroupが何であるかを説明するいくつかのリソースに向けて私を指摘できますか? – Edmondo1984