2015-12-28 1 views
2

Не удалось найти слово «Monad», когда я искал книгу SICP 2nd Edition. Какая концепция (или главы) SICP относится к Монаде?Monad and Структура и интерпретация компьютерных программ

+2

Eugenio Moggi впервые описал общее использование монадов для структурирования программ в 1991 году. SICP был опубликован в 1984 году. – molbdnilo

+0

Спасибо, Но я имел в виду второе издание, которое появилось в 2005 году, я обновил вопрос. – coder000001

+2

Второе издание было опубликовано в июле 1996 года. Монадские I/O - первые «широко распространенные» монады - появились в Haskell в мае 1996 года. Монады не стали широко известны до 21-го века. – molbdnilo

ответ

5

Ничто в SICP явно не содержит моноды: книга была написана задолго до того, как кто-либо формализовал концепцию монады, относящейся к компьютерному программированию (игнорируя здесь математическую идею монады, а это другая вещь). Но некоторые вещи в книге все равно монадичны: списки, например, являются монадой, знаете ли вы это или нет.

+0

Есть ли альтернативная книга, которая охватывает последние исследования, в том числе монады? Можете ли вы обновить ответ yur, если он есть. – coder000001

1

SICP использует схему. Схема позволяет совершать произвольные действия вместе. Ничто не мешает вам это сделать. Другими словами, вы в основном работаете в монаде-до-ничего. Кроме того, они, как правило, не являются такими полезными или идомальными в языке с несколькими парадигмами, как Lisp (тем самым, я имею в виду, что Scheme не принимает сторон, это своего рода мутация, которая делает их табу с суффиксом «!»).

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

Итак, монады не так полезны в языковых настройках, как схема. И, как справедливо сказал Амалуа, они были изобретены тогда.

РЕДАКТИРОВАТЬ 1: Прояснение первого абзаца. У вас могут быть монады в Lisp (нечистый язык), просто у вас нет системы типов, следя за тем, чтобы вы не смешивали эффекты. Я использовал IO в монаде (Racket + functional/better-monads). Тем не менее, дизайн модели монады может быть весьма полезен, как то, как Maybe и List используются в Clojure/Racket, как указал Алексис Кинг.

EDIT 2: Для таких вещей, как State и ST (которые, вероятно, вы видите в большинстве случаев использования, поскольку многие (большинство?) Алгоритмов используют возможность изменения), монады на самом деле не имеют большого смысла. Кроме того, как я уже указывал, вы не получаете гарантий, которые вы ожидаете от Haskell в большинстве Lisps.

+3

-1, в то время как Haskell использует монад для ввода-вывода, монада «IO» - единственная «волшебная» монада, и много монад полезно даже в Схеме. Модификация Maybe, например, пробилась в Clojure в виде 'some->'. Ваш ответ не ошибочен (существует множество причин, по которым схема не использует монады как абстракцию), но первый абзац является плохим аргументом и немного вводит в заблуждение. –

+0

Мне показалось, что я упоминал Схему, а не Clojure (что сильно зависит от FP, но я не знаю много об этом, кроме статьи wiki). Тем не менее, Scheme (ну, Racket) позволяет вам иметь несколько эффектов в монаде. Я попробовал смешивать операции ввода-вывода в монаде списка, который также выполняет IO. Таким образом, это не настоящая монада, как в Haskell (тип sigs не соответствует). Тем не менее, я признаю, что этот стиль композиции может быть весьма полезен и на Схеме (хотя я видел, что, возможно, можно действовать в любом месте. – Akaberto

Смежные вопросы