Подтвердить что ты не робот

Какая польза от монадов в OCaml?

Это может быть глупый вопрос, но поскольку OCaml не является чистым и имеет встроенные побочные эффекты, то в чем польза monads в OCaml?

4b9b3361

Ответ 1

Монады не имеют ничего общего с чистотой, за исключением того, что чистый язык без Монад будет почти совершенно бесполезным.

В условиях неспециалиста Монада - это всего лишь набор правил, описывающих, как последовательность шагов может быть выполнена. Наличие абстракции Monad дает вам возможность определять DSL для выполнения работы. Монада может быть построена так, чтобы разумно обрабатывать такие вещи, как исключения, откаты/коммиты ATOMIC, логику повтора, спать между каждым шагом и т.д.

Вот несколько примеров Monads:

https://wiki.haskell.org/Monad#Interesting_monads

Я понимаю, что этот список для Haskell, который является чистым языком, но не позволяйте этому путать вас.

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

  • Единичная функция, определенная как (a → M a), называемая "return" в Haskell, используется для помещения значения в контекст Monad.

  • Операция привязки, определенная как (M t → (t → M u) → M u), которая выглядит страшно, но если вы внимательно посмотрите, это функция, которая вызывается между каждым шагом процесс, вот где вы вводите хороший материал.

В зависимости от языка может быть больше вещей, но это его сердце.

Ответ 2

В то время как OCaml поддерживает стандартные побочные эффекты, предоставляемые большинством языков, это не включает в себя все возможные побочные эффекты. Существует ряд эффектов, которые OCaml не поддерживает. Многие из этих эффектов могут быть закодированы с использованием Monads. Например,

  • Concurrency (см. библиотеки Lwt и Async)
  • Недетерминированный выбор
  • Первоклассные продолжения
  • Амбивалентный выбор и откат

Используя более сложные представления вычислений, такие как параметризованные монады, можно кодировать еще более экзотические эффекты. Например,

  • Полиморфное состояние
  • Линейные ресурсы

Ответ 3

В то время как OCaml позволяет писать императивный код, он по-прежнему функциональен по своей природе, он используется функциональными программистами. И мы предпочитаем использовать постоянные структуры данных и алгоритмы, когда это возможно.

Что касается вашего вопроса, то, в частности, монады полезны для асинхронных вычислений, например, Lwt, Async, где они используются для привязки вычислений (вместо обычного способа настройки обратных вызовов). Кроме того, монады используются для обработки ошибок вместо исключений. Кроме того, монады очень полезны при написании парсеров, см. Библиотеку mparser. Есть и другие виды использования, я перечислял только самые популярные.

В общем, монады просто позволяют вам скрыть сложный поток управления под простым последовательным синтаксисом.

Ответ 4

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