Kann mir jemand durch diese Haskell-Funktion (State monad related) gehen?

7
%Vor%

Ich bin verwirrt darüber, wie put (n+1) überhaupt Auswirkungen auf das Endergebnis dieser Funktion hat. Es scheint, als ob diese Funktion den ursprünglichen Zustand unverändert zurückgeben sollte. Ich versuche, mir das durch den Kopf zu gehen, aber mir bleibt der Raum draußen, um die Dinge in Position zu halten. : \

Wenn mich jemand durch die Auswertung dieser Funktion führen könnte, wäre das sehr hilfreich.

    
Rayne 25.11.2009, 09:45
quelle

3 Antworten

10
  

... Wie aktualisiert Puts den Zustand überhaupt? Es scheint nur da zu sitzen und nichts zu tun ...

Ah, jetzt verstehe ich deine Frage. Sie fragen sich, wie put (und get ) funktionieren, oder?

Vielleicht hilft ein Beispiel in JavaScript (eine Sprache mit tatsächlich veränderbarem Zustand):

%Vor%

Ich hoffe, dies veranschaulicht, dass, während sich n nicht ändert, der interne Status immer noch aktualisiert wird. Wenn Sie tick() zweimal ausführen, wird der Status zweimal erhöht.

Um zu Haskell zurückzukehren, hier ist die vollständige Definition von (den relevanten Teilen) von State monad:

%Vor%

Versuchen Sie nun, Ihr tick Beispiel noch weiter zu erweitern, indem Sie >>= , return , get und put manuell inline setzen. Hoffentlich wird es klarer werden, wie State funktioniert.

    
Tom Lokhorst 25.11.2009, 12:14
quelle
7

Sie haben vollkommen recht. Das "Ergebnis" von tick "function" ist der Anfangswert des Zustands.

Nun ist natürlich tick nicht die wirkliche "Funktion", sondern eine Berechnung, die Zustand lesen und schreiben kann, bevor ein Ergebnis erzeugt wird.
In diesem Fall wird der Status aktualisiert, aber Sie geben immer noch den ursprünglichen Wert des Status zurück:

%Vor%

In diesem Fall wird der geänderte Status nicht angezeigt, da Sie den Status nie erneut in tick überprüfen. Wenn jedoch nach tick eine andere Berechnung stattfindet, kann der aktualisierte Status angezeigt werden.

Wenn Sie beispielsweise tick zweimal ausführen (der zweite wird den aktualisierten Status lesen):

%Vor%     
Tom Lokhorst 25.11.2009 10:25
quelle
5

es könnte helfen, es mit do notation

zu schreiben %Vor%

, während put (n+1) sich nicht auf das Ergebnis der Berechnung auswirkt, ändert es den Zustand, der innerhalb der Statusmonade gehalten wird.

    
barkmadley 25.11.2009 10:31
quelle

Tags und Links