- Монада (программирование)
-
Мона́да в программировании — это абстракция линейной цепочки связанных вычислений. Её основное назначение — инкапсуляция функций с побочным эффектом от чистых функций, а точнее их выполнений от вычислений[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
. - ↑ Евгений Кирпичев. Монады в Haskell (рус.).Монады — «обобщение некоторых привычных идиом, а также как еще один метод для их абстракции».
Ссылки
Учебные пособия
- Monad Tutorials Timeline (англ.) Большая коллекция пособий по монадам, представлены в порядке появления.
- What the hell are Monads?
- You Could Have Invented Monads! (And Maybe You Already Have.), простое введение
- All About Monads
- Monads as Computation
- Monads as Containers
- Monads for the Working Haskell Programmer
- The Haskell Programmer’s Guide to the IO Monad — Don’t Panic
- Introduction to Haskell, Part 3: Monads
- On Monads
- Crash Monad Tutorial (англ.) — статья о монадах, объясняющая их с точки зрения теории категорий
- Learn You a Haskell for Great Good! (англ.) — книга содержит доступное описание языка Haskell, в котором много внимания уделено понятию монады и аналогичным конструкциям
Другие статьи
- A tour of the Haskell Monad functions (англ.)
- Notions of Computation and Monads от Eugenio Moggi, первая статья, предлагающая использование монад в программировании
- «Monads for Functional Programming» от Philip Wadler, описание монад в языке Хаскелл (написано еще до того, как они в нем появились)
- 4. Монады — простое изложение основ языка
Литература
- Душкин Р.В. Охрана // Приёмы программирования // Функции // Синтаксис и идиомы языка // Справочник по языку Haskell / Гл. ред. Д. А. Мовчан. — М.: ДМК Пресс, 2008. — С. 37-38. — 554 с. — 1500 экз. — ISBN 5-94074-410-9, ББК 32.973.26-018.2, УДК 004.4
- П. Д. Симон. 8. Лекция: Стандартное начало (Prelude) // Язык и библиотеки Haskell 98.
- Erkok Levent. Value Recursion in Monadic Computations. Oregon Graduate Institute. — 2002. — 162 p.
Категории:- Теория категорий
- Haskell
- Концепции языков программирования
Wikimedia Foundation. 2010.