5

Scalaz 7 Validation や disjunction を使用して、失敗する可能性のある操作のリストを処理し、その結果を管理し始めました。

この種のユースケースには、十分に文書化された 2 つのケースがあります。

1/ 何かの条件のリストをチェックし、エラーがあればそれを蓄積したい。ここでは、常にリストの最後に移動し、エラーが発生した場合、グローバルな結果として失敗します。そして、それは機能するアプリカティブ ファンクターです。

2/ 失敗する可能性のあるいくつかのステップを実行し、最初に失敗したステップで停止したい。ここに、理解のために Scala でうまくいくモナドがあります。

したがって、同じ行にある他の 2 つの使用例がありますが、前例のいずれにもうまく対応していないようです: ステップのリストを処理し、失敗する可能性があり、エラーと成功の両方の結果を蓄積したい (例:これはファイルの変更のリストであり、エラーが発生する可能性があるのは、それが外界であるためです。成功した場合は、後で保持したいパッチです)。

2 つのユース ケースの違いは、(最初のエラーで) 早期に停止するか、リストの最後に移動する場合のみです。

OK、それで正しいことは何ですか?

(質問を書くと、それは単純なfoldLeftだと思いますよね?ここで質問を検証させます。他の誰かが不思議に思うなら)

4

4 に答える 4

5

Validation#appendまたはそのエイリアスを見てくださいValidation#+|+。2 つの検証が与えられ、両方が成功した場合、追加された値の成功を返します。どちらも失敗の場合は、追加された値の失敗を返します。それ以外の場合は、成功した値を返します。これには、成功タイプの暗黙の Semigroup インスタンスが必要です。

于 2012-08-10T14:54:56.237 に答える
4

私はこのようなことをします:

scala> List(1.success[String], 2.success[String], "3".failure[Int], "4".failure[Int]).partition(_.isSuccess)
res2: (List[scalaz.Validation[java.lang.String,Int]], List[scalaz.Validation[java.lang.String,Int]]) = (List(Success(1), Success(2)),List(Failure(3), Failure(4)))

scala> val fun = (_:List[Validation[String, Int]]).reduceLeft(_ append _)
fun: List[scalaz.Validation[String,Int]] => scalaz.Validation[String,Int] = <function1>

scala> fun <-: res2 :-> fun
res3: (scalaz.Validation[String,Int], scalaz.Validation[String,Int]) = (Success(3),Failure(34))

UPD: #129#130をマージするとfun(_:List[Validation[String, Int]]).concatenateまたはに変更できます(_:List[Validation[String, Int]]).suml

またはbimapこのように:

scala> List(1.success[String], 2.success[String], "3".failure[Int], "4".failure[Int]).partition(_.isSuccess).bimap(_.suml, _.suml)
res6: (scalaz.Validation[java.lang.String,Int], scalaz.Validation[java.lang.String,Int]) = (Success(3),Failure(34))
于 2012-08-10T16:36:55.510 に答える
1

必要なのは、おおよそにに切り替えることEither[E, A]ですWriter[List[E], A]Writerモナドは、発生したエラーをログに記録します。

于 2012-08-29T14:00:09.160 に答える
0

結果が得られるので、「警告」または「ログ」と呼びますが、「失敗」のペア(SomveValue, List[T])が必要なようです。実際には失敗ではありません。T

しかし、Scalazがこれに何か気の利いたものがあるかどうかはわかりません。

于 2012-08-10T15:00:46.437 に答える