Являются ли продолжения монады? - PullRequest
16 голосов
/ 20 марта 2009

Можно ли назвать продолжения монадой? Это подмножество монад или просто способ реализации монад?

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

Ответы [ 5 ]

23 голосов
/ 21 марта 2009

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

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

17 голосов
/ 20 марта 2009

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

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

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

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

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

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

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

6 голосов
/ 20 марта 2009

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

4 голосов
/ 22 июля 2009

Очень хорошая статья на эту тему: http://blog.sigfpe.com/2008/12/mother-of-all-monads.html

1 голос
/ 05 августа 2010

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

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

Тем не менее, Cont<Cont<T>> - это монада, и это то, что обычно называют «монадой продолжения».

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

...