2015-08-08 12 views
9

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!

+4

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

+4

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

risposta

13

tuo tutorial è a partire dal 2006. Esso utilizza a very old version of Data.Map in quale tipo lookup s' era infatti:

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

Mi sa che il cambiamento è avvenuto perché fail è ampiamente considerato come una verruca nella classe Monad. Restituire un Maybe a rende un errore di ricerca esplicito e gestibile. Rendendolo implicito nascondendolo dietro fail solo per avere un tipo leggermente più conveniente è molto sporco IMO. (Vedi anche la domanda collegata da Ørjan.)

Problemi correlati