我理解Monad和
如果这是真的,我对这些Scala Play JSON docs感到困惑:
引用:
引用:
Applicative
之间的一个区别是,Monad
上有flatMap
,而Applicative
上没有。如果这是真的,我对这些Scala Play JSON docs感到困惑:
引用:
所以有趣的地方在于JsResult[A]是一种单调结构, 可以与此类结构的经典函数一起使用:
flatMap[X](f: A => JsResult[X]): JsResult[X]
等等
但是,然后文档继续说:引用:
请注意,JsResult[A]不仅是Monad,而且还是Applicative, 因为它会累积错误。这种累积特性使JsResult[T] 不太适合与for推导一起使用,因为 您只会得到第一个错误而不是所有错误。
据我所知,for-comprehension
是flatMap
的语法糖,那么JsResult
如何同时成为Applicative
和Monad
呢?
Validation
,就可以明白这是什么意思。 - wheaties\/
(是单子但不积累错误)和Validation
(不是单子但是积累错误)。简而言之,当你拥有一个单子时,也就有了一个适用函子,并且有一些很好的理由避免Play采取的方法(对于相同类型具有不同的单子和适用行为)。 - Travis Brown