Являются ли продолжения монады?
Можно ли назвать продолжения монадой? Это подмножество монад или просто способ реализации монад?
Редактировать: Или, может быть, я неправильно понял, и монады - более абстрактное понятие, чем продолжения? (Так что я действительно сравниваю яблоки с апельсинами здесь)
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
.)