В ближайшем будущем, когда мы должны использовать монаду вместо макроса и наоборот? - PullRequest
25 голосов
/ 28 марта 2012

Существует слишком много учебных пособий по монадам, в которых говорится: «Смотри! Вот случай, когда мы можем использовать монаду» или «Вот для чего нужна монада».Я хочу знать, какие шаги люди используют для того, чтобы прийти к выводу, что они могут сказать себе: «Черт возьми! Похоже, мы можем использовать монаду здесь!»

Поэтому, когда кто-то говорит мне ... "(бла) не имеет ничего общего с монадой ...", это действительно не помогает мне ответить на мой вопрос:

  • Как мне определить, какие шаблоны в программах можно выразить с помощью монад?
  • Как я могу написать свою собственную монаду, когда я определил потенциал для их использования?

Я задал очень длинный вопрос о монадах, если кто-то заинтересован помочь - Составить карту и уменьшить монаду для Clojure ... А как насчет Юкда Монады? .

Вернуться к этому вопросу:

Когда мы должныиспользовать монаду вместо макроса и наоборот?

  • Я читал статьи и смотрел презентации, в которых говорилось: «Монады используются для абстракции DSL» .... нобольшинство библиотек clojure DSL (например, hiccup и korma) используют defmacro, и это прекрасно работает.

И зачем нам монады в clojure, если у нас есть макросы?

Ответы [ 3 ]

37 голосов
/ 28 марта 2012

Я использую Clojure уже два года, и единственный раз, когда я использовал монады, это было упражнение, чтобы показать, что это можно сделать.Я никогда не нуждался в них для «реального» кода.

Монады гораздо более распространены в Haskell, потому что:

  • Они - идиоматический способ обработки вычислений с состоянием.В Clojure вы обычно обрабатываете состояние с помощью управляемых ссылок , поэтому монады в Clojure почти не нужны.
  • Аналогично для IO: Clojure позволяет вам выполнять IO напрямую, не объявляя его в вашем типе, поэтому вам не нужна монада IO.

Мое предложение будет сосредоточиться настандартное функциональное программирование в Clojure.Если вы не видите, что вам действительно нужны монады, я бы не стал тратить слишком много времени на попытки их ввести.

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

  1. Я хочу расширить синтаксис языка таким образом, чтобы значительно улучшить мою способность решать конкретную проблемную область.
  2. I не может получить ту же функциональность, что и обычные функции / композиция функций.Нормальные функции должны быть вашим первым выбором, если это возможно: их, как правило, проще писать и поддерживать.

PS Если вы искренне интересуетесь монадами для Clojure, вот два видео, которые я лично нашел довольно хорошими:1027 *

16 голосов
/ 29 марта 2012

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

Что касается «когда можно использовать монады в Clojure», я вижу два варианта использования:

1) Для реализации вещей, которые имеют смысл в более чем одной монаде, для того, чтобы выполнить работу только один раз и «подключить» монаду позже. Здесь - хорошая иллюстрация этого подхода, хотя, к сожалению (с педагогической точки зрения) для довольно нетривиального приложения: логическое программирование.

2) Для реализации техники композиции, котораяможет быть сформулирован как монада, чтобы извлечь выгоду из существующей инфраструктуры монад.

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

Это, к сожалению, остается довольно абстрактным.В настоящее время не так много опубликованных и отлаженных примеров кода, которые используют монады в Clojure.По мере того, как все больше Clojurians знакомятся с монадами, и больше экспертов по монадам (обычно из Haskell) используют Clojure, это, вероятно, изменится.Я видел (но не имел под рукой) монадический синтаксический анализ, сделанный, например, в Clojure.

4 голосов
/ 13 февраля 2013

@ khinsen и @mikera ответили на вопрос так хорошо, что вряд ли можно было сделать какие-либо дополнительные комментарии, но я думаю, что они пропустили одно очко (или я не смог найти его в их комментариях).

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

В отличие от макросов, монады не являются частью Clojure. Они построены с использованием конструкций языка, а именно макросов. Они не включены во время выполнения, если вы не настаиваете на том, чтобы они были там. Для меня монады - это шаблоны проектирования для составления вычислений, и поэтому они похожи на другие шаблоны проектирования, с которыми вы, возможно, знакомы. Вы используете шаблоны проектирования для разработки модульных и связных приложений, и будь то монады, макросы или любые другие языковые конструкции, вы должны знать, что они существуют, и работать с ними для вашего блага.

Что касается вашего вопроса, макросы работают еще до того, как появятся монады. Макросы работают на этапе компиляции - они изменяют структуры данных на другие структуры данных. Монады - это шаблон дизайна для составления вычислений. В этом разница. В Clojure монады пишутся с использованием макросов (чтобы облегчить их использование), и поэтому люди, как правило, говорят, что вы можете делать с монадами, которых вы легко можете достичь с помощью макросов. Это верно, поскольку это происходит от дизайна монад в Clojure, но то же самое можно сказать и о самих макросах. Вам не нужно писать новые большую часть времени, и первое правило макроклуба - вообще не писать их , но все же они являются частью языка, и вы должны очень хорошо знают свои приложения.

См. Как программисты Clojure используют макросы? для более подробного обсуждения макросов.

...