2015-08-08 3 views
9

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!

+4

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. –

+4

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

Antwort

13

Ihr Tutorial ist aus dem Jahr 2006. Es nutzt a very old version of Data.Map in denen lookup ‚s Art in der Tat war:

lookup :: (Monad m, Ord k) => k -> Map k a -> m a 

Ich rechne damit, die Änderung geschah, weil fail weithin als eine Warze in der Monad Klasse betrachtet wird. Die Rückgabe eines Maybe a macht einen Lookup-Fehler explizit und verwaltbar. Machen Sie es implizit, indem Sie es hinter fail verstecken, nur um einen etwas bequemeren Typ zu haben, ist sehr dreckig IMO. (Siehe auch die Frage von Ørjan.)

Verwandte Themen