2009-03-20 11 views
16

Могут ли продолжения быть монадами? Являются ли они подмножеством монадов или они просто способ реализации монад?Продолжают ли монады?

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

+1

Продолжения все. Продолжения могут реализовывать структуры данных; продолжения могут реализовывать классы и объекты; продолжения могут реализовывать монады.Я не понимаю, что этот вопрос имеет отношение к Haskell, хотя, кроме как продолжения и монад ... – ephemient

+0

Я тоже. Я вообще не добавлял тег Haskell и, честно говоря, меня больше интересует объяснение в другом контексте. – troelskn

+1

@troelskn: Я согласен с вашим редактированием; продолжение - это другой зверь, чем монады. Это немного похоже на вопрос, являются ли деревянные доски дома. Они * могли бы быть, если бы они были объединены как таковые. Но они также могут быть другими. –

ответ

17

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

Из 'все о монады' учебник в Haskell:

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

F # продолжение монада, используется для реализации 'перерыв' и 'продолжить' для в-стиле-петли

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

И пример применения продолжение монада к задаче F #:

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

6

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

+0

Я немного взволнован, но это не CPS в C#. Это функция полезности, которая принимает функцию и возвращает значение, возвращаемое этой функцией вызывающему. Ничего общего с CPS. –

+0

К сожалению, неверная ссылка. Исправлена. Как уже отмечалось, это лишь приближение к CPS, а не к реальной CPS (я не думаю, что это возможно на C#, но мне придется подумать об этом чуть больше). –

22

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

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

+0

Согласен, результат впечатляет. Позвольте мне подчеркнуть, что это вложение происходит на языке с «ограниченным» (или, как утверждает Филински «композиционные») продолжения. Они строго более мощные, чем значения продолжения, которые вы получаете от вызова/cc в Схеме. – dubiousjim

+2

@profjim: на самом деле Филински также показал, как реализовать разграниченные продолжения, используя обычные продолжения и состояния. Он реализовал все это в SML/NJ, используя callcc. – RD1

4

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

+2

+1 для цитирования blog sigfpe. Какая красивая сокровищница удивительности. Автору удается объяснить теорию категорий и другие далекие понятия в подробном, просвещенном, но до-земном пути. Самые умные люди, в моей книге, являются лучшими учителями. –

1

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

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

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

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