8

との違いの1 つについての私の理解では、では利用できますが、 では利用できません。MonadApplicativeflatMapMonadApplicative

それが本当なら、私はこれらの Scala Play JSON docsに混乱しています:

興味深いのは、JsResult[A] がモナド構造であり、そのような構造の古典的な関数で使用できることです。

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

しかし、その後、ドキュメントは次のように続けます。

JsResult[A] はエラーを累積するため、Monadic ではなく Applicative であることに注意してください。この累積的な機能により、JsResult[T] を理解のために使用するのはあまり適切ではありません。

私が理解しているように、 afor-comprehensionは の構文糖衣であるためflatMap、どのようにして aとJsResultの両方になることができますか?ApplicativeMonad

4

1 に答える 1

4

MonadのサブクラスですApplicativeApplicativeapplyは より弱い動作ですflatMap。したがってapply、の観点から実装できますflatMap

しかしJsResult(または実際には)、計算の静的形式Readsを利用する特別な実装があります。Applicative

たとえば、以下の 2 つの定義は、正しい JSON で同等に動作しますが、Applicative( を使用するand) は、誤った場合に優れたエラー メッセージを表示します (たとえば、barとの両方quuxが無効である場合に言及します)。

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)
于 2015-02-22T17:50:18.827 に答える