Sto andando anche se il seguente documento: Monad Transformers Step by Step. Nella sezione 2.1 "Conversione in stile monadico", una funzione viene convertita per restituire Value
nella monade Eval1
. Questa parte della funzione non ha senso per me:Il risultato Forse da Map.lookup non è il tipo di controllo con il mio stack Monad Transformer
eval1 env (Var n) = Map.lookup n env
Il risultato di questo sarà Maybe Value
tuttavia firma di tipo della funzione è:
eval1 :: Env → Exp → Eval1 Value
La funzione non riesce a digitare controllo, e l'errore mi sembra ovvio. Eppure, l'autore afferma esplicitamente che questo funzionerà:
... il caso Var non ha bisogno di una chiamata fromJust più: Il motivo è che Map.lookup è definito per lavorare all'interno di qualsiasi monade semplicemente chiamando monade di fallire funzione - questo si adatta bene alla nostra formulazione monadica qui.
La firma per Map.lookup non sembra che è stato progettato per funzionare con qualsiasi monade:
lookup :: Ord k => k -> Map k a -> Maybe a
È questo il documento non aggiornati o mi sto perdendo qualcosa? Se la carta è in effetti non aggiornata, perché è stato modificato lookup
per funzionare solo con Maybe
.
Grazie!
Non è aggiornato (dal momento che 'contenitori' versione 0.2.0.0, dal 2008). Questo metodo è stato brevemente popolare, ma poi è andato di nuovo fuori moda. Vedi [questa domanda] (http://stackoverflow.com/questions/3030767/haskell-maps-returning-a-monad), in particolare la risposta di Don Stewart. –
La prossima volta che ti chiedi se un'interfaccia è cambiata, di solito puoi ottenere la risposta guardando le vecchie e le nuove versioni su Hackage. – dfeuer