... ¿Cómo se pone la actualización del estado en primer lugar? Parece estar sentado allí sin hacer nada ...
Ah, ahora entiendo su pregunta. ¿Te estás preguntando cómo funcionan put
(y get
), ¿verdad?
Tal vez un ejemplo en JavaScript ayudará (un lenguaje con el estado mutable real):
var s; // mutable state
function get() { return s; }
function put(x) { s = x; }
function tick() {
var n = get();
put(n + 1);
return n;
}
espero que esto ilustra que, mientras n
no cambia, el estado interno todavía se actualizará. Si ejecuta tick()
dos veces, el estado se incrementará dos veces.
para volver a Haskell, aquí está la definición completa de (las partes pertinentes) de la State
mónada:
newtype State s a = State { runState :: s -> (a, s) }
instance Monad (State s) where
return a = State $ \s -> (a, s)
m >>= k = State $ \s -> let
(a, r) = runState m s
in runState (k a) r
get = State $ \s -> (s, s)
put s = State $ \_ -> ((), s)
Ahora trata de ampliar su ejemplo tick
aún más mediante la inclusión entre líneas manualmente >>=
, return
, get
y put
. Con suerte, se verá más claro cómo funciona el estado.
¡Te gané por 5 segundos enteros! Es extraño cómo tiendo a resolver las cosas por mi cuenta/después/He hecho la pregunta. Aprecio las respuestas! :) – Rayne