Монада состояния "интерфейс"
class MonadState s m where
get :: m s
put :: s -> m ()
(+ возвращают и связывают), позволяет создавать любое возможное вычисление с монадой состояния без использования 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 -> ...)
?
Я так не думаю. Рассмотрим типы:
Cont :: ((a -> r) -> r) -> Cont r a
callCC :: ((a -> Cont r b) -> Cont r a) -> Cont r a
Если у вас есть только callCC
, нигде не будет использоваться r
как тип - он может быть любым. Поэтому я не знаю, как вы могли бы перевести что-то, что использует его как тип, например:
Cont (const 42) :: Cont Int a
У меня нет возможности ограничить r
, если у меня есть только callCC
.
Во всяком случае, это моя догадка. Не очень строго, но кажется убедительным.