Государственная монада "интерфейс"
class MonadState s m where
get :: m s
put :: s -> m ()
(+ return и bind) позволяет создавать любые возможные вычисления с помощью монады State без использования конструктора State
. Например, State $ \s -> (s+1, s-1)
можно записать как
do s <- get
put (s-1)
return (s+1)
Точно так же мне никогда не придется использовать конструктор Reader
, потому что я могу создать это вычисление, используя ask
, return
и (>>=)
. Точно: Reader f == ask >>= return . f
.
То же самое верно для продолжений - возможно ли написать все экземпляры Cont r a
, используя callCC
(единственная функция в MonadCont
), return и bind, и никогда не вводить что-то вроде Cont (\c -> ...)
?