Подтвердить что ты не робот

Моноды продолжения?

Могут ли продолжения считаться монадами? Являются ли они подмножеством монадов или это просто способ реализации монад?

Изменить: Или, может быть, я ошибся, а монады - более абстрактное понятие, чем продолжение? (Итак, я действительно сравниваю яблоки с апельсинами здесь)

4b9b3361

Ответ 1

Вкратце, поскольку "связывание" монады принимает в качестве аргумента эффективное продолжение (лямбда "остальной части вычисления" ), монады являются продолжениями в этом смысле. С другой стороны, стиль продолжения прохождения может быть эффективно реализован на языке, отличном от CPS, с использованием монадических синтаксических сахаров, как это предлагается рядом различных ссылок ниже.

Из учебника "все о монадах" в Haskell:

https://www.haskell.org/haskellwiki/All_About_Monads#The_Continuation_monad

Монада продолжения F #, используемая для реализации "break" и "continue" для for-style-loops

http://cs.hubfs.net/forums/thread/9311.aspx

И пример применения продолжения монады к задаче в F #:

http://lorgonblog.spaces.live.com/blog/cns!701679AD17B6D310!256.entry

Ответ 2

Не только продолжения монадов, но они являются своего рода универсальной монадой, в том смысле, что если у вас есть продолжение и состояние, вы можете имитировать любую функциональную монаду. Этот впечатляющий, но высоко технический результат исходит из впечатляющего и высокотехнического ума Andrzej Filinski, который написал в 1994 году или около того:

Покажем, что любая монада, чьи единицы и операции расширения выражаются в виде чисто функциональных членов, могут быть встроены в язык "по требованию" с "составными продолжениями".

Ответ 3

Они могут быть, хотя им и не нужно. Я бы немного изменил ваш вопрос и сказал вместо этого, что монады - это способ реализации продолжений. Но вы можете реализовать продолжение по-разному - вы можете сделать скромный, но ограниченный факсимильный код CPS в С# без особых усилий, например. Посмотрите Продолжение Monad с сайта Haskell для очень тщательного лечения.

Ответ 5

Продолжение - это определенная функция в программе. Монады - это конструкторы типов.

Конструктор типа Cont<T> для продолжений, принимающих тип T, не был бы монадой.

Однако Cont<Cont<T>> является монадой, и это то, что принято называть "продолжением монады".

(Наличие callcc на языке эквивалентно возможности преобразования из Cont<Cont<T>> в T.)