Scala JsResult-Monad还是Applicative?
我对Scala JsResult-Monad还是Applicative?,scala,monads,applicative,playframework-json,Scala,Monads,Applicative,Playframework Json,我对Monad和Applicative的区别之一的理解是flatMap可以在Monad上找到,但不能在Applicative上找到 如果这是真的,我对这些Scala Play JSON感到困惑: 有趣的是,JsResult[A]是一个一元结构 并可用于此类结构的经典功能: flatMap[X](f:A=>JsResult[X]):JsResult[X] 等 但是,文件接着说: 请注意,JsResult[A]不仅是一元的,而且是应用性的 因为它会累积错误。此累积特性使JsResult[T] 这使得
Monad
和Applicative
的区别之一的理解是flatMap
可以在Monad
上找到,但不能在Applicative
上找到
如果这是真的,我对这些Scala Play JSON感到困惑:
有趣的是,JsResult[A]是一个一元结构
并可用于此类结构的经典功能:
flatMap[X](f:A=>JsResult[X]):JsResult[X]
等
但是,文件接着说:
请注意,JsResult[A]不仅是一元的,而且是应用性的
因为它会累积错误。此累积特性使JsResult[T]
这使得它不能很好地用于理解,因为
您将只得到第一个错误,而不是全部错误
据我所知,一个用于理解的
是flatMap
的语法糖,那么JsResult
怎么可能既是一个Applicative
又是一个Monad
?Monad
呢Applicative
的操作比flatMap
弱。因此,apply
可以根据flatMap
实现
但是,在JsResult
(或者实际上读取
)的情况下,它有一个特殊的实现,它利用了应用的
计算的静态形式
例如,下面的两个定义与正确的JSON行为相同,但是Applicative
(使用和)在错误情况下有更好的错误消息(例如,提到如果bar
和qux
都无效):
val applicativeReads:Reads[Foo]=(
(“条”)。读[Int]和
(uu \“qux”)。读取[字符串]
)(Foo.apply)
val monadicReads:Reads[Foo]=for{
bar看一看ScalazValidation
,看看这到底是什么意思。@wheaties,啊,这本书(Scala中的函数编程)中有介绍我做过的练习-。这是一样的,是吗?这样你可以通过Monad
或Applicative
执行验证并读取所有错误?我实际上不打算回答这个问题,因为我肯定我会把它搞砸。将Monad
和Applicative
添加到你的标记中,我打赌会有更多的眼球回答。Bas从理论上讲,一个应用程序所增加的是另外两种方法pure
和
。后者“解决”了链接异常的问题(前提是它们被保存在半群
中)。同样,请阅读以下内容:另请参阅Scalaz的\//code>(它是一元的,不会累积错误)简而言之,当你有一个单子的时候,你也有一个应用函子,并且有一些很好的理由来避免游戏所采取的方法(对同一类型有不同的单子和应用行为)。
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)