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.
... 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:
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.
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:
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):
es könnte helfen, es mit do
notation
, während put (n+1)
sich nicht auf das Ergebnis der Berechnung auswirkt, ändert es den Zustand, der innerhalb der Statusmonade gehalten wird.