Продолжение монады "Интерфейс" - PullRequest
10 голосов
/ 17 апреля 2010

Государственная монада "интерфейс"

class MonadState s m where
    get :: m s
    put :: s -> m ()

(+ return и bind) позволяет создавать любые возможные вычисления с помощью монады State без использования конструктора 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), return и bind, и никогда не вводить что-то вроде Cont (\c -> ...)?

1 Ответ

7 голосов
/ 18 апреля 2010

Я так не думаю. Глядя на типы:

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.

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

...