Моноды продолжения?
Могут ли продолжения считаться монадами? Являются ли они подмножеством монадов или это просто способ реализации монад?
Изменить: Или, может быть, я ошибся, а монады - более абстрактное понятие, чем продолжение? (Итак, я действительно сравниваю яблоки с апельсинами здесь)
Ответы
Ответ 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 для очень тщательного лечения.
Ответ 4
Очень хорошая статья по этой теме:
http://blog.sigfpe.com/2008/12/mother-of-all-monads.html
Ответ 5
Продолжение - это определенная функция в программе. Монады - это конструкторы типов.
Конструктор типа Cont<T>
для продолжений, принимающих тип T
, не был бы монадой.
Однако Cont<Cont<T>>
является монадой, и это то, что принято называть "продолжением монады".
(Наличие callcc на языке эквивалентно возможности преобразования из Cont<Cont<T>>
в T
.)