Kev*_*ith 8 monads scala applicative playframework-json
我认识一个之间的区别Monad,并Applicative是flatMap可用的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,怎么可能JsResult是Applicative和Monad?
Monad是 的子类Applicative。Applicative的apply操作比 弱flatMap。因此apply可以根据 来实施flatMap。
但是,在JsResult(或实际上Reads)情况下,它具有利用Applicative计算静态形式的特殊实现。
例如,下面的两个定义与正确的 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)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
446 次 |
| 最近记录: |