16-10-2023
Мона́да в программировании — это абстракция линейной цепочки связанных вычислений. Её основное назначение — инкапсуляция функций с побочным эффектом от чистых функций, а точнее их выполнений от вычислений[1]. Монады применяются в языке Haskell, так как он повсеместно использует ленивые вычисления, которые вместе с побочным эффектом, как правило, образуют плохо прогнозируемый результат. Она описывается[2] полиморфным контейнерным типом для выполнений с одним параметром, стратегией «поднятия» значения в монаду и стратегией связывания двух вычислений, второе из которых зависит от параметра, вычисляемого первым:
m :: * -> * class Monad m where (>>=) :: m a -> (a -> m b) -> m b (>>) :: m a -> m b -> m b return :: a -> m a fail :: String -> m a class Functor f where fmap :: (a -> b) -> f a -> f b
Функция return
описывает «возвращение» (втягивание) типа a
в монаду m
, то есть обрамление его контейнером. Функция fail
не имеет отношения к теоретической сущности монад, однако используется в случае ошибки сопоставления с образцом внутри монадического кода — останавливает процесс последовательных действий и выводит сообщение о причине ошибки (в будущих версиях библиотеки может быть переведён в отдельный класс[3]). Оператор >>=
описывает, что в монаде действия происходят последовательно, то есть после применения функции её результат передаётся далее (.. -> a -> b -> ..), примером которой может быть передача текста в буфер: типы данные облачаются в монаду (конструктором), а затем с ними функция производит действия, в данном случае добавление. Оператор >>
— частный случай оператора >>=
, когда предыдущие данные просто заменяются следующими, которые не формируются на основании предыдущих.
В частности, к монадам относятся:
IO
(монада строго последовательных вычислений): стратегия связывания — «сначала первое вычисление, затем второе»;Maybe
(монада вычислений с отсутствующими значениями): стратегия связывания — «если первое вычисление дало результат, то второе; иначе — отсутствие результата»;List
(монада вычислений с несколькими результатами): стратегия связывания — «все возможные результаты второго вычисления, примененного к каждому из вычисленных первым значений параметра»;State
(монада вычислений с переменной состояния): стратегия связывания — «начать второе вычисление с состоянием, измененным в результате первого»;Монады также применяются для синтаксического анализа, продолжений (continuations), вероятностных вычислений и в других случаях.
Концепция монад в программировании была унаследована из теории категорий: Монада (математика)
Содержание |
Monad
находится в модуле Monad
пакета Control
и в стандартном модуле Prelude
, класса Functor
и MonadPlus
— только в модуле Monad
пакета Control
.Монада (программирование).