Ich gehe durch das folgende Papier: Monad Transformers Step by Step. In Abschnitt 2.1 "Konvertieren in Monadic Style" wird eine Funktion in Value
in der Eval1
Monade konvertiert. Dieser Teil der Funktion macht keinen Sinn für mich machen:Das Maybe-Ergebnis von Map.lookup ist keine Typprüfung mit meinem Monad Transformer Stack
eval1 env (Var n) = Map.lookup n env
Das Ergebnis davon wird Maybe Value
sein aber die Art Signatur der Funktion ist:
eval1 :: Env → Exp → Eval1 Value
Die Funktion eingeben versagt überprüfen, und Der Fehler scheint mir offensichtlich. Doch der Autor erklärt ausdrücklich, dass dies funktionieren wird:
... Var Fall kein fromJust Anruf mehr brauchen: Der Grund dafür ist, dass Map.lookup definiert wird, indem einfach in jeder Monade arbeiten die Monade Aufruf scheitern Funktion - das passt gut zu unserer monadischen Formulierung hier.
Die Signatur für Map.lookup sieht nicht, wie es mit jeder Monade arbeiten ausgelegt ist:
lookup :: Ord k => k -> Map k a -> Maybe a
Ist das Papier nicht mehr aktuell oder bin ich etwas fehlt? Wenn das Papier tatsächlich veraltet ist, warum wurde lookup
geändert, um nur mit Maybe
zu arbeiten.
Danke!
Es ist veraltet (seit Container Version 0.2.0.0, ab 2008). Diese Methode war kurzzeitig beliebt, ging dann aber wieder aus der Mode. Siehe [diese Frage] (http://stackoverflow.com/questions/3030767/haskell-maps-returning-a-monad), insbesondere Don Stewarts Antwort. –
Wenn Sie sich das nächste Mal wundern, wenn sich eine Schnittstelle geändert hat, können Sie die Antwort normalerweise erhalten, wenn Sie sich alte und neue Versionen von Hackage ansehen. – dfeuer