2013-01-09 17 views
8

Scalaz6での検証のコレクションを処理するための慣習的な方法はありますか?Scalaz6検証のリストの処理

val results:Seq[Validation[A,B]] 
val exceptions = results.collect{case Failure(exception)=>exception} 
exceptions.foreach{logger.error("Error when starting up ccxy gottware",_)} 
val success = results.collect{case Success(data)=>data} 
success.foreach {data => data.push} 
if (exceptions.isEmpty) 
    containers.foreach(_.start()) 

結果をループするときに折り目を使用すると思いますが、最終テストはどうですか?

答えて

9

検証リストを使用する通常の方法は、sequenceを使用してリストをValidation[A, List[B]]にすることです。途中でエラーがあった場合は空になります(つまり、Failure)。

シーケンシングa Validationは、左手型のセミグループでエラーを累積します(Eitherはすぐに失敗します)。このため、Validationの代わりにValidationNELNELNonEmptyListを表します)がよく使われます。

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を参照してください。

+0

無料の場合はどうですか?少なくとも検証が成功したら、成功したいですか? – Edmondo1984

+0

あなたは 'Validation'の穀粒に対して働いているようです。 7ではリストを '|||'で減らすことができましたが、6では 'Either'の正しい射影のためにセミグルームを使った和のようなものが必要になります(あるいは独自の' ||| 'を書くこともできます)。 –

+0

Semigroupが何であるかを説明するいくつかのリソースに向けて私を指摘できますか? – Edmondo1984

関連する問題