Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala JsResult-Monad还是Applicative?_Scala_Monads_Applicative_Playframework Json - Fatal编程技术网

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看一看Scalaz
Validation
,看看这到底是什么意思。@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)