2010-04-04 3 views
12

Je suis en train de lire le chapitre Monades dans Real World Haskell (chapitre 14). Une fonction est defined comme suit:La raison de MonadState obtenir et mettre?

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

Je ne comprends pas vraiment le but de l'obtenir et de mettre les fonctions ici. Je Réécriture de la fonction suivante qui semble faire la même chose et est plus concis:

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

Ma question est: Quel est le but de faire et de mettre en général?

+1

Juste dans ce cas, ou le but de 'get' et' put' en général? Leur utilisation peut être plus facilement expliquée dans ce dernier cas ... – kennytm

+0

En général; Je vais éditer ma question. – CiscoIPPhone

Répondre

12

Il est un peu une coïncidence que random arrive à avoir exactement le même modèle signature/usage type que la fonction interne du State monade (et même dans ce cas, vous pourriez être encore plus concise, si peut-être plus confuse, avec getRandom2 = State random).

Toutefois, plus généralement, cela ne s'applique pas, et puis get et put sont des pièces de plomberie commodes dont la signification est peut-être plus claire que d'écrire directement la fonction interne. Ils aident également à faire abstraction de la représentation précise utilisée par State - ils sont en fait des membres de la classe plus générale MonadState, donc vous pouvez écrire plus de code polymorphe en les utilisant.

+0

J'ai une autre question - comment le * put * garde le nouvel état pour le prochain appel? La sortie de * put * est ignorée, je ne peux pas le comprendre. Sil te plait aide moi. THX. –

+0

Cela fait partie de la plomberie interne de la monade 'State'. La sortie monadique de 'put' est de type'() 'pour indiquer que ce n'est pas une valeur utile. –

+0

Thx pour la réponse. Mais je ne comprends pas complètement. Cela signifie-t-il que le * put * a un effet secondaire? Pouvez-vous expliquer comment il stocke le nouvel état? THX. –

Questions connexes