JsResult - Monad oder Applicative?

8

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?

    
Kevin Meredith 17.01.2014, 15:13
quelle

1 Antwort

4

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):

%Vor%     
phadej 22.02.2015 17:50
quelle