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

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

4 ответов


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

вот несколько примеров монад:

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

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

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

  1. единичная функция, определенная как (a - > M a), называемая "return" в Haskell, используемая для ввода значения в контекст монады.

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

в зависимости от языка, могут быть многое другое, но в этом суть.


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

  • параллелизм (см. библиотеки Lwt и Async)
  • недетерминированный выбор
  • продолжение первого класса
  • амбивалентный выбор и откат

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

  • полиморфное состояние
  • линейный ресурсов

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

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

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


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