2017-10-03 7 views
1

私はScalaを学んでいますが、Scalaz ValidationNelを使用してFail Slowメカニズムを使用しましたが、使用方法を理解することは本当に難しいです。私はこれらのブログを読んでいる:Blog1、私もこのStackOverflowの投稿を読んでいる:StackOverflowしかし、それは実際に非機能的なプログラマーのために理解することは困難です。誰かがScalaのValidationNelにエラーを累積する方法の簡単な例を提供できますか?この例についての説明もあまりにも役立つでしょう。これが何をしているか、あなたがScalazはValidationNelを使用して遅くなります

val sumV: ValidationNEL[String, Int] = for { 
    a <- 42.successNel[String] 
    b <- "Boo".failNel[Int] 
    c <- "Wah wah".failNel[Int] // by defn of flatMap, can't get here 
} yield a + b + c 

をリンクしたブログの例を使用して

答えて

1

はチェーン一緒に様々な操作にflatMapを使用しています。たとえば、42.uccessNel [String]はSuccessを作成し、 "Boo" .failNel [Int]は失敗を作成します。 flatMapがここで動作する方法は、成功した場合にのみ次の操作を続けることです。したがって、これは「フェイル・ファスト」操作です。エラー・ケースに最初のエラーを収集して停止します。

"遅くする" - つまり、可能性のあるすべての失敗を収集するには、別の方法を使用する必要があります。 Applicativeの出番です

val yes = 3.14.successNel[String] 
val doh = "Error".failNel[Double] 

def addTwo(x: Double, y: Double) = x + y 

(yes |@| yes)(addTwo) // Success(6.28) 
(doh |@| doh)(addTwo) // Failure(NonEmptyList(Error, Error)) 

(a |@| b)(someFunctionOfTwoArgsHere) - 。これは、「『』操作を実行し、そして 『B』の操作を実行されると言って、両方が成功した場合、(a、b)はsomeFunctionOfTwoArgsHereを実行している何それ以外の場合は、失敗を取って組み合わせてください。失敗した場合でもbが成功すると、失敗の結果で検証エラーが発生します。

+0

私はOOPのバックグラウンドから来ており、あなたの例を 'if(condition)'ステートメントでcorelatedしようとしています。 – Explorer

+0

'val yes = 3.14.successNel [文字列] 'は、ValidationNEL [String、Int]オブジェクトのインスタンスを作成しています。型パラメータ(StringとInt)は失敗と成功の場合をそれぞれ指します。この種類のオブジェクトには、リフト上のタイプの空でないリスト(この場合はString)または右のタイプの単一インスタンス(Int)が含まれます。このタイプのオブジェクトには '| @ |'ビヘイビアがエンコードされています。そのビヘイビアは - 別のValidationNelをとり、オブジェクトの実際の値が何であるかを確認します。 – Ren

+0

その場合は、適切な引数を取り、それを関数で実行し、その結果をSuccessオブジェクトに入れます。それとも両方とも失敗ですか、それとも失敗ですか?その場合は、Failureを取得してリストに組み込み、そのリストをFailureオブジェクトに配置します。 – Ren

関連する問題