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...
なぜMonadStateのインスタンスには状態とモナドが必要なのですか?なぜ、単一のパラメータStateクラスを作成しないのですか?MonadStateでMultiParamTypeClassesを使用する理由
私があなたが提案している代替品を理解しているかどうかはわかりません。 'state ::(s - >(a、s)) - > m a'の型を' m'と 's'の両方で書くことはどうですか? – Owen
'class MonadState s where ...'から始め、sをモナドに入れずに 'get :: s'と' put :: s - >() 'を実行するとします。私たちがMaybe状態かEither状態かIO状態かどうかを気にする必要のない、より単純な状態実装を実現できますか? –