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...
Perché un'istanza di MonadState necessita di uno stato e di una monade, perché non creare una classe di stato a parametro singolo?Perché utilizzare MultiParamTypeClasses in MonadState
Non sono sicuro di capire l'alternativa che stai suggerendo. Come scriveresti il tipo di 'stato :: (s -> (a, s)) -> m a' senza entrambi' m' e 's'? – Owen
diciamo che dovremmo iniziare da 'class MonadState s dove ...' e facciamo semplicemente 'get :: s' e' put :: s ->() 'senza inserire s in una monade? Potrebbe raggiungere un'implementazione dello stato più semplice in cui non dobbiamo preoccuparci se si tratta di uno stato Forse o uno stato di Either o IO? –