class Monad m => MonadState s m | m -> s where
-- | Return the state from the internals of the monad.
get :: m s
get = state (\s -> (s, s))
-- | Replace the state inside the monad.
put :: s -> m()
put s = state (\_ -> ((), s))
-- | Embed a simple state action into the monad.
state :: (s -> (a, s)) -> m a
state f = do
s <- get
let ~(a, s') = f s
put s'
return a
instance MonadState s m => MonadState s (MaybeT m) where...
¿Por qué una instancia de MonadState necesita un estado y una mónada? ¿Por qué no crear un solo parámetro State class?Por qué usar MultiParamTypeClasses en un MonadState
No estoy seguro de entender la alternativa que está sugiriendo. ¿Cómo escribirías el tipo de 'state :: (s -> (a, s)) -> m a' sin ambos' m' y 's'? – Owen
digamos que comenzaríamos desde 'clase MonadState s donde ...' y simplemente hacemos 'get :: s' y' put :: s ->() 'sin poner s en una mónada? ¿Podría lograr una implementación estatal más simple en la que no tengamos que preocuparnos si se trata de un estado Tal vez o un estado O bien un estado IO? –