JsResult - Monad还是Appative?

Kev*_*ith 8 monads scala applicative playframework-json

我认识一个之间的区别Monad,并ApplicativeflatMap可用的Monad,但不是Applicative.

如果这是真的,我对这些Scala Play JSON 文档感到困惑:

所以有趣的是JsResult [A]是一个monadic结构,可以用于这种结构的经典函数:

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

等等

但是,然后文件继续说:

请注意,JsResult [A]不仅仅是Monadic而且是Applicative,因为它累积了错误.这个累积的特性使得JsResult [T]使得用于理解不是很好,因为你只会得到第一个错误,而不是全部错误.

因为,据我所知,一个for-comprehension是语法糖flatMap,怎么可能JsResultApplicativeMonad

pha*_*dej 4

Monad是 的子类ApplicativeApplicativeapply操作比 弱flatMap。因此apply可以根据 来实施flatMap

但是,在JsResult(或实际上Reads)情况下,它具有利用Applicative计算静态形式的特殊实现。

例如,下面的两个定义与正确的 JSON 的行为等效,但Applicative(使用and)在错误情况下有更好的错误消息(例如,提及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)
Run Code Online (Sandbox Code Playgroud)