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...
Dlaczego instancja MonadState potrzebuje stanu i monady, dlaczego nie utworzyć pojedynczego parametru State class?Dlaczego warto używać MultiParamTypeClasses w MonadState?
Nie jestem pewien, czy rozumiem alternatywę, którą sugerujesz. Jak napisalibyśmy typ 'state :: (s -> (a, s)) -> m a' bez obu' m' i 's'? – Owen
powiedzmy, że zaczniemy od 'class MonadState s, gdzie ...' a my po prostu robimy 'get :: s' i' put :: s ->() 'bez wprowadzania s do monady? Czy można osiągnąć prostszą implementację stanu, w której nie musimy się martwić, czy jest to stan Może, czy stan, czy stan IO? –