Монада продолжения “интерфейс”

Монада состояния "интерфейс"

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 -> ...)?

10
задан Don Stewart 19 April 2011 в 01:38
поделиться

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 .

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

7
ответ дан 4 December 2019 в 02:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: