Являются ли продолжения монадами?
-
21-08-2019 - |
Вопрос
Можно ли сказать, что продолжения являются монадами?Являются ли они подмножеством монад или это просто способ реализации монад?
Редактировать: Или, может быть, я что - то неправильно понял и монады является более абстрактным понятием , чем продолжения?(Так что я действительно сравниваю здесь яблоки с апельсинами)
Решение
Вкратце, поскольку "привязка" монады принимает эффективное продолжение (лямбда "остальной части вычисления") в качестве аргумента, монады являются продолжениями в этом смысле.С другой стороны, стиль передачи продолжения может быть эффективно реализован на языке, отличном от 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
.)