2014-09-19 9 views
5

Nel leggere il lavoro originale di Wadler Monads for Functional Programming (1992), mi sento come se sto ricevendo, ma, nella descrizione non monade di un gestore di Stato, egli mostra la descrizione proto-monade di uno Stato:La carta di Wadler: come funziona una tupla?

type M a = State -> (a, State) 
eval :: Term -> M Int 
eval (Con a) x = (a, x) 

Ed è smesso di fare di nuovo un senso. Come dovrei leggere questo? A quanto ho capito, questo dice che eval prende un int e uno stato e restituisce una funzione che accetta uno stato e restituisce una nuova coppia (Int, Stato)

Ma ... come fa (a, x), che , se sto leggendo questo diritto è una tupla di un valore e uno stato, is-a "funzione che prende uno stato e restituisce una nuova coppia (Int, stato)"?

+0

controllare nuovamente la firma - 'eval :: Term -> M Int' non dice direttamente che' eval' prende un 'State'! Lo prende solo una volta, espanso dall'alias "M", al contrario del doppio, che la tua descrizione fa sembrare. – Xeo

+10

@jww Questa domanda riguarda specificamente l'implementazione Haskell di questo concetto. La risposta/spiegazione del problema che il richiedente sta avendo è particolare del linguaggio di programmazione Haskell, quindi penso che appartenga qui a StackOverflow. –

+0

@jww Lasciando se questo appartiene il SO da parte (sono d'accordo con David qui però), questo assolutamente _non_ appartiene su CS. – Cubic

risposta

14

Espandere il tipo sinonimo: Term -> M Int è equivalente a Term -> State -> (Int, State).

In alternativa, pensare alla definizione di funzione come eval (Con a) = \x -> (a, x).

+0

Ho seguito entrambi gli esercizi, come raccomandato. I * think * I get it. Le sostituzioni avevano comunque senso, ma io sto ancora lottando con l'idea di come ottenere i risultati dell'espressione della calcolatrice alla fine. –

Problemi correlati