2014-01-17 2 views
8

私の理解では、flatMapMonadはなく、Applicativeに利用可能であるということです。JsResult - MonadまたはApplicative? <code>Monad</code>と<code>Applicative</code>の区別のの

それが本当ならば、私はこれらのスカラ座で混乱しているがJSON docsを再生する:

をだから、面白いものをJsResult [A]がモナド構造 であり、そのような構造の古典的な機能を使用できることがあります:

flatMap [X](F:A => JsResult [X]):JsResult [X]

など

しかし、その後、ドキュメントが言うように行く:。

それがエラーを累積するためJsResult [A]は、単に単項しかしApplicativeの ではないことに注意してくださいは、この累積的な機能により、JsResult [T] は、 がすべてではなく最初のエラーだけを取得するため、理解のために使用するのはあまり良いことになりません。私が理解し、for-comprehensionflatMapためのシンタックスシュガーであり、以来

、どのようJsResult両方ApplicativeMonadことができますか?

+0

Scalaz 'Validation'を見てみましょうこれが何を意味するのかを正確に見てください。 – wheaties

+0

@wheaties、ああ、それは私が取り組んできた本(Functional Programming in Scala)でカバーされています - https://github.com/kman007us/side-work/blob/master/MonadsSbt/src/main/scala/適用/ ValidationApplicative.scala。それは同じ、そうですか?だから、あなたは 'Monad'や' Applicative'を使ってバリデーションを行い、* all *エラーを読むことができますか? –

+1

私は実際にこの質問に答えるつもりはないので、私はそれを台無しにするだろうと確信しています。あなたのタグに 'Monad'と' Applicative 'を追加し、もう少し多くの眼球が答えるでしょう。基本的に、全ての 'Applicative'の追加は' pure'と '<*>'という2つのメソッドよりも多くなっています。後者は、例外を連鎖させる問題を解決するものです(彼らが「Semigroup」で開催されている場合)。 – wheaties

答えて

4

MonadApplicativeのサブクラスです。 Applicativeapplyは、flatMapより弱い操作です。従って、applyは、flatMapの観点から実施することができる。

しかしは、JsResult(または実際にReads)場合には、それはApplicative計算の静的なフォームを利用し、特殊な実装を持っています。

など。下の2つの定義が正しいJSONと同等に振る舞う、まだ(andを使用しています)Applicativeは(barquux両方が無効な場合などには言及して)誤った場合に、より良いエラーメッセージを持っている:

val applicativeReads: Reads[Foo] = (
    (__ \ "bar").read[Int] and 
    (__ \ "quux").read[String] 
)(Foo.apply _) 

val monadicReads: Reads[Foo] = for { 
    bar <- (__ \ "bar").read[Int] 
    quux <- (__ \ "quux").read[String] 
} yield Foo(bar, quux) 
関連する問題