2010-04-04 8 views
12

Ich lese das Kapitel Monaden in Real World Haskell (Kapitel 14). Eine Funktion ist defined wie folgt:Der Grund für MonadState bekommen und setzen?

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

verstehe ich nicht wirklich den Zweck der Erfassung und Wiedergabe hier Funktionen setzen. schrieb ich die Funktion, wie folgend, die die gleiche Sache zu tun scheint und ist prägnanter:

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

Also meine Frage ist: Was ist der Zweck ist und im Allgemeinen gestellt bekommen?

+1

Nur in diesem Fall, oder der Zweck von "get" und "Put" im Allgemeinen? Ihre Verwendung kann im letzteren Fall leichter erklärt werden ... – kennytm

+0

Im Allgemeinen; Ich werde meine Frage bearbeiten. – CiscoIPPhone

Antwort

12

Es ist ein bisschen wie ein Zufall, dass random genau die gleiche Art Signatur/Verwendungsmuster als die innere Funktion des State Monade haben, geschieht (und in der Tat in diesem Fall könnten Sie noch mehr prägnant sein, wenn auch vielleicht noch verwirrender, mit getRandom2 = State random).

Allerdings wird das allgemein nicht gelten, und dann get und put sind bequeme Sanitär-Stücke, deren Bedeutung ist vielleicht klarer als das Schreiben der inneren Funktion direkt. Sie helfen auch, von der genauen Darstellung zu abstrahieren, die von State verwendet wird - sie sind tatsächlich Klassenmitglieder der allgemeineren Klasse MonadState, so dass Sie mehr polymorphen Code schreiben können, indem Sie sie verwenden.

+0

Ich habe noch eine Frage - wie die * Put * den neuen Zustand für den nächsten Anruf behalten? Die Ausgabe von * put * wird ignoriert, ich kann es nicht herausfinden. Bitte hilf mir. Danke. –

+0

Das ist Teil der internen Installation der 'State' Monade. Die monadische Ausgabe von 'put' ist vom Typ'() ', um anzuzeigen, dass es kein nützlicher Wert ist. –

+0

Thx für die Antwort. Aber ich verstehe es nicht ganz. Bedeutet es, dass die * Put * Nebenwirkungen haben? Kannst du erklären, wie es den neuen Staat speichert? Danke. –

Verwandte Themen