Продолжение 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.

Во всяком случае, это моя догадка. Не ужасно строгий, но кажется убедительным.