Являются ли продолжения монады?

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

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

5 ответов

Решение

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам