Mein Verständnis von eins der Unterschiede zwischen Monad
und Applicative
ist, dass flatMap
für Monad
verfügbar ist, aber nicht für Applicative
.
Wenn das stimmt, bin ich verwirrt durch diese Scala Play JSON Dokumentation :
Was interessant ist, ist, dass JsResult [A] eine monadische Struktur ist und kann mit klassischen Funktionen solcher Strukturen verwendet werden:flatMap [X] (f: A = & gt; JsResult [X]): JsResult [X]
usw.
Aber dann sagen die Ärzte:
Bitte beachten Sie, dass JsResult [A] nicht nur Monadic, sondern auch Applicative ist weil es Fehler kumuliert. Dieses kumulative Feature macht JsResult [T] macht es nicht sehr gut mit zum Verständnis verwendet zu werden, weil Sie erhalten nur den ersten Fehler und nicht alle.
Da, wie ich verstanden habe, ein for-comprehension
syntaktischer Zucker für flatMap
ist, wie kann JsResult
sowohl ein Applicative
als auch Monad
sein?
Monad
ist eine Unterklasse von Applicative
. Applicative
s apply
ist eine schwächere Operation als flatMap
. Somit könnte apply
in flatMap
implementiert werden.
Aber , im Fall JsResult
(oder tatsächlich Reads
) gibt es eine spezielle Implementierung, die Applicative
computers statische Form ausnutzt.
z. die beiden folgenden Definitionen verhalten sich äquivalent zu korrektem JSON, aber Applicative
(das and
verwendet) weist in fehlerhaften Fällen bessere Fehlermeldungen auf (z. B. Erwähnung, wenn sowohl bar
als auch quux
ungültig sind):
Tags und Links scala applicative monads playframework-json