2010-04-04 11 views
12

Sto leggendo il capitolo di Monade in Real World Haskell (capitolo 14). Una funzione è defined come segue:Il motivo per cui MonadState viene messo e messo?

type RandomState a = State StdGen a 
getRandom :: Random a => RandomState a 
getRandom = 
    get >>= \gen -> 
    let (val, gen')= random gen in 
    put gen' >> 
    return val 

Io non capisco lo scopo della get e mettere funzioni qui. Ho riscritto la funzione come segue che sembra fare la stessa cosa ed è più conciso:

getRandom2 :: Random a => RandomState a 
getRandom2= State $ \ s -> random s 

Quindi la mia domanda è: Qual è lo scopo di ottenere e mettere in generale?

+1

Proprio in questo caso, o lo scopo di 'get' e' put' in generale? Il loro uso può essere spiegato più facilmente in quest'ultimo caso ... – kennytm

+0

In generale; Modificherò la mia domanda. – CiscoIPPhone

risposta

12

E 'un po' di una coincidenza che random succede ad avere esattamente lo stesso tipo di pattern firma/uso come la funzione interna del State Monade (e in effetti in questo caso si potrebbe essere ancora più conciso, anche se forse più confuso, con getRandom2 = State random).

Tuttavia, più in generale ciò non si applica, e quindi get e put sono pezzi idraulici convenienti il ​​cui significato è forse più chiaro rispetto alla scrittura della funzione interna direttamente. Aiutano anche ad astrarre dalla precisa rappresentazione usata da State - sono in realtà membri di classe della classe più generale MonadState, quindi puoi scrivere più codice polimorfico usandoli.

+0

Ho ancora una domanda: come il * put * mantiene il nuovo stato per la prossima chiamata? L'output di * put * viene ignorato, non riesco a capirlo. Per favore aiutatemi. Grazie. –

+0

Fa parte dell'impianto idraulico interno della monade "Stato". L'output monadico di 'put' è di tipo'() 'per indicare che non è un valore utile. –

+0

Thx per la risposta. Ma non capisco completamente. Significa che la * put * ha qualche effetto collaterale? Puoi spiegare come memorizza il nuovo stato? Grazie. –

Problemi correlati