Вопрос

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

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

Это было полезно?

Решение

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

Из учебника "все о монадах" на 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.запись

Другие советы

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top