Интерфейс "монада" состояния
class MonadState s m where
get :: m s
put :: s -> m ()
(+ return and bind) позволяет построить любое возможное вычисление с государственной монадой без использования конструктора 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
), вернуть и привязать и никогда не вводить что-то вроде Cont (\c -> ...)
?