Монада (программирование)
Мона́да в программировании в это абстракция линейной цепочки связанных вычислений. Её основное назначение в инкапсуляция функций с побочным эффектом от чистых функций, а точнее их выполнений от вычислений[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.