Продолжение monad "interface"
Интерфейс "монада" состояния
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 -> ...)
?
Ответы
Ответ 1
Я так не думаю. Глядя на типы:
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
.
Во всяком случае, это моя догадка. Не ужасно строгий, но кажется убедительным.