Монады - это объединение нескольких вещей в вычислительной технике, которые ранее рассматривались как отдельные. Когда я говорю «объединение», я имею в виду то же самое, что и физик: так же, как ньютоновская гравитация объединяла планетарные орбиты с земной баллистикой, а уравнения Максвелла объединяли электрические и магнитные поля, так и монады объединяли следующее:
- Последовательность (сделайте A, затем B, затем C).
- Обработка исключений (Выполните A. Если это не удалось, тогда выполните B).
- Параллельная обработка (выполните A и B параллельно, затем объедините их результаты).
- Недетерминизм (Выполните A. Для каждого возможного результата выполните B. Для каждого возможного результата выполните C).
- Конечные автоматы .
- Логическое программирование , а-ля Пролог.
И, возможно, еще кое-что, о чем я забыл. Как только вы поймете общую теорию монад, вы поймете, что она применима ко многим вещам, точно так же, как уравнения Максвелла открыли весь электромагнитный спектр, вместо того, чтобы мы думали, что свет и радио были двумя отдельными явлениями и, следовательно, не понимая, что были действительно интересные вещи между ними.
Одним из побочных эффектов этой общности является то, что вы можете писать свои собственные конструкции потока управления. Версии Haskell «while» и «for» не встроены, они являются частью стандартной библиотеки. Если вы хотите что-то другое, вы можете написать это.
Основными понятиями в монадах являются «связать» (т. Е. Оператор (>> =)) и «вернуть» (это действительно глупое имя, но мы застряли с ним). Есть несколько основных законов, которым они должны подчиняться. Грубо говоря, обеим операциям не разрешается делать что-то скрытое. Таким образом, «return» не может иметь побочных эффектов, а перестановка скобок в последовательной цепочке операций «bind» не может изменить смысл программы.
Это действительно абстрактный материал, поэтому он выглядит странно для программистов, воспитанных на традиционных императивных языках. Только когда вы поняли полдюжины различных монад, вы оцените фундаментальное единство концепции. Люди, изучающие Haskell, впервые сталкиваются с монадой ввода-вывода, потому что она нужна для «Hello World». В этот момент это выглядит как странный способ делать то, что делает любая другая программа. Это связано с тем, что монада IO является моделью работы любого другого языка программирования (кроме пролога); последовательность действий, влияющих на реальный мир, включая именованные места в физической памяти.
Большое преимущество монад Haskell состоит в том, что, в отличие от любого другого языка программирования, он не попадает в ловушку IO. Вы можете сортировать определения монад на других языках, но они по-прежнему выполняются в том, что Хаскелл будет считать монадой ввода-вывода. Поскольку Haskell чист, он позволяет вам избежать ограничений ввода-вывода и определить новые монады как истинные абстракции.