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...
Tại sao một thể hiện của MonadState cần một trạng thái và một đơn nguyên, tại sao không tạo một lớp Trạng thái thông số duy nhất?Tại sao sử dụng MultiParamTypeClasses trong MonadState
Tôi không chắc chắn tôi hiểu thay thế bạn đang đề xuất. Làm thế nào bạn sẽ viết kiểu 'state :: (s -> (a, s)) -> m a' mà không có' m' và 's'? – Owen
giả sử chúng ta sẽ bắt đầu từ 'lớp MonadState s ở đâu ...' và chúng ta chỉ làm 'get :: s' và' put :: s ->() 'mà không đặt s trong một đơn nguyên? Nó có thể đạt được một thực hiện trạng thái đơn giản hơn, nơi chúng ta không phải lo lắng về nếu nó là một trạng thái Có thể hoặc một trạng thái hoặc trạng thái IO? –