Монада (программирование)

Поделись знанием:
Перейти к: навигация, поиск

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

Концепция монад в программировании была унаследована из теории категорий.





Напишите отзыв о статье "Монада (программирование)"

Примечания

  1. Контейнер не имеет задачи инкапсулирования данных.
  2. Описание класса Monad находится в модуле Monad пакета Control и в стандартном модуле Prelude, класса Functor и MonadPlus — только в модуле Monad пакета Control.
  3. Евгений Кирпичев. [www.rsdn.ru/article/funcprog/monad.xml Монады в Haskell] (рус.).Монады — «обобщение некоторых привычных идиом, а также как еще один метод для их абстракции».

Ссылки

Учебные пособия

  • [www.haskell.org/haskellwiki/Monad_tutorials_timeline Monad Tutorials Timeline] (англ.) Большая коллекция пособий по монадам, представлены в порядке появления.
  • [web.cecs.pdx.edu/~antoy/Courses/TPFLP/lectures/MONADS/Noel/research/monads.html What the hell are Monads?]
  • [sigfpe.blogspot.com/2006/08/you-could-have-invented-monads-and.html You Could Have Invented Monads! (And Maybe You Already Have.)], простое введение
  • [www.haskell.org/haskellwiki/Monads_as_computation Monads as Computation]
  • [www.haskell.org/haskellwiki/Monads_as_containers Monads as Containers]
  • [www.engr.mun.ca/~theo/Misc/haskell_and_monads.htm Monads for the Working Haskell Programmer]
  • [stefan-klinger.de/files/monadGuide.pdf The Haskell Programmer’s Guide to the IO Monad — Don’t Panic]
  • [www.onlamp.com/pub/a/onlamp/2007/08/02/introduction-to-haskell-pure-functions.html Introduction to Haskell, Part 3: Monads]
  • [c2.com/cgi/wiki?OnMonads On Monads]
  • [patryshev.com/monad/m-intro.html Crash Monad Tutorial] (англ.) — статья о монадах, объясняющая их с точки зрения теории категорий
  • [learnyouahaskell.com/ Learn You a Haskell for Great Good! ] (англ.) — книга содержит доступное описание языка Haskell, в котором много внимания уделено понятию монады и аналогичным конструкциям

Другие статьи

  • [members.chello.nl/hjgtuyl/tourdemonad.html A tour of the Haskell Monad functions] (англ.)
  • [www.disi.unige.it/person/MoggiE/ftp/ic91.pdf Notions of Computation and Monads] от Eugenio Moggi, первая статья, предлагающая использование монад в программировании
  • [homepages.inf.ed.ac.uk/wadler/papers/marktoberdorf/baastad.pdf «Monads for Functional Programming»] от Philip Wadler, описание монад в языке Хаскелл (написано еще до того, как они в нем появились)
  • [sovety.blogspot.com/2009/09/haskell-horrors.html 4. Монады] — простое изложение основ языка

Литература

  • Душкин Р.В. Охрана // Приёмы программирования // Функции // Синтаксис и идиомы языка // Справочник по языку Haskell / Гл. ред. Д. А. Мовчан. — М.: ДМК Пресс, 2008. — С. 37-38. — 554 с. — 1500 экз. — ISBN 5-94074-410-9, ББК 32.973.26-018.2, УДК 004.4.
  • Пейтон-Джонс, Саймон. 8. Лекция: Стандартное начало (Prelude) // [www.intuit.ru/department/pl/haskel98/8/ Язык и библиотеки Haskell 98].
  • Erkok Levent. Value Recursion in Monadic Computations. Oregon Graduate Institute. — 2002. — 162 p.

Отрывок, характеризующий Монада (программирование)

– Сomme c'est un homme d'esprit votre pere, – сказала она, – c'est a cause de cela peut etre qu'il me fait peur. [Какой умный человек ваш батюшка. Может быть, от этого то я и боюсь его.]
– Ax, он так добр! – сказала княжна.


Князь Андрей уезжал на другой день вечером. Старый князь, не отступая от своего порядка, после обеда ушел к себе. Маленькая княгиня была у золовки. Князь Андрей, одевшись в дорожный сюртук без эполет, в отведенных ему покоях укладывался с своим камердинером. Сам осмотрев коляску и укладку чемоданов, он велел закладывать. В комнате оставались только те вещи, которые князь Андрей всегда брал с собой: шкатулка, большой серебряный погребец, два турецких пистолета и шашка, подарок отца, привезенный из под Очакова. Все эти дорожные принадлежности были в большом порядке у князя Андрея: всё было ново, чисто, в суконных чехлах, старательно завязано тесемочками.
В минуты отъезда и перемены жизни на людей, способных обдумывать свои поступки, обыкновенно находит серьезное настроение мыслей. В эти минуты обыкновенно поверяется прошедшее и делаются планы будущего. Лицо князя Андрея было очень задумчиво и нежно. Он, заложив руки назад, быстро ходил по комнате из угла в угол, глядя вперед себя, и задумчиво покачивал головой. Страшно ли ему было итти на войну, грустно ли бросить жену, – может быть, и то и другое, только, видимо, не желая, чтоб его видели в таком положении, услыхав шаги в сенях, он торопливо высвободил руки, остановился у стола, как будто увязывал чехол шкатулки, и принял свое всегдашнее, спокойное и непроницаемое выражение. Это были тяжелые шаги княжны Марьи.
– Мне сказали, что ты велел закладывать, – сказала она, запыхавшись (она, видно, бежала), – а мне так хотелось еще поговорить с тобой наедине. Бог знает, на сколько времени опять расстаемся. Ты не сердишься, что я пришла? Ты очень переменился, Андрюша, – прибавила она как бы в объяснение такого вопроса.
Она улыбнулась, произнося слово «Андрюша». Видно, ей самой было странно подумать, что этот строгий, красивый мужчина был тот самый Андрюша, худой, шаловливый мальчик, товарищ детства.
– А где Lise? – спросил он, только улыбкой отвечая на ее вопрос.
– Она так устала, что заснула у меня в комнате на диване. Ax, Andre! Que! tresor de femme vous avez, [Ax, Андрей! Какое сокровище твоя жена,] – сказала она, усаживаясь на диван против брата. – Она совершенный ребенок, такой милый, веселый ребенок. Я так ее полюбила.
Князь Андрей молчал, но княжна заметила ироническое и презрительное выражение, появившееся на его лице.
– Но надо быть снисходительным к маленьким слабостям; у кого их нет, Аndre! Ты не забудь, что она воспитана и выросла в свете. И потом ее положение теперь не розовое. Надобно входить в положение каждого. Tout comprendre, c'est tout pardonner. [Кто всё поймет, тот всё и простит.] Ты подумай, каково ей, бедняжке, после жизни, к которой она привыкла, расстаться с мужем и остаться одной в деревне и в ее положении? Это очень тяжело.
Князь Андрей улыбался, глядя на сестру, как мы улыбаемся, слушая людей, которых, нам кажется, что мы насквозь видим.
– Ты живешь в деревне и не находишь эту жизнь ужасною, – сказал он.
– Я другое дело. Что обо мне говорить! Я не желаю другой жизни, да и не могу желать, потому что не знаю никакой другой жизни. А ты подумай, Andre, для молодой и светской женщины похорониться в лучшие годы жизни в деревне, одной, потому что папенька всегда занят, а я… ты меня знаешь… как я бедна en ressources, [интересами.] для женщины, привыкшей к лучшему обществу. M lle Bourienne одна…
– Она мне очень не нравится, ваша Bourienne, – сказал князь Андрей.
– О, нет! Она очень милая и добрая,а главное – жалкая девушка.У нее никого,никого нет. По правде сказать, мне она не только не нужна, но стеснительна. Я,ты знаешь,и всегда была дикарка, а теперь еще больше. Я люблю быть одна… Mon pere [Отец] ее очень любит. Она и Михаил Иваныч – два лица, к которым он всегда ласков и добр, потому что они оба облагодетельствованы им; как говорит Стерн: «мы не столько любим людей за то добро, которое они нам сделали, сколько за то добро, которое мы им сделали». Mon pеre взял ее сиротой sur le pavе, [на мостовой,] и она очень добрая. И mon pere любит ее манеру чтения. Она по вечерам читает ему вслух. Она прекрасно читает.
– Ну, а по правде, Marie, тебе, я думаю, тяжело иногда бывает от характера отца? – вдруг спросил князь Андрей.
Княжна Марья сначала удивилась, потом испугалась этого вопроса.
– МНЕ?… Мне?!… Мне тяжело?! – сказала она.
– Он и всегда был крут; а теперь тяжел становится, я думаю, – сказал князь Андрей, видимо, нарочно, чтоб озадачить или испытать сестру, так легко отзываясь об отце.
– Ты всем хорош, Andre, но у тебя есть какая то гордость мысли, – сказала княжна, больше следуя за своим ходом мыслей, чем за ходом разговора, – и это большой грех. Разве возможно судить об отце? Да ежели бы и возможно было, какое другое чувство, кроме veneration, [глубокого уважения,] может возбудить такой человек, как mon pere? И я так довольна и счастлива с ним. Я только желала бы, чтобы вы все были счастливы, как я.
Брат недоверчиво покачал головой.
– Одно, что тяжело для меня, – я тебе по правде скажу, Andre, – это образ мыслей отца в религиозном отношении. Я не понимаю, как человек с таким огромным умом не может видеть того, что ясно, как день, и может так заблуждаться? Вот это составляет одно мое несчастие. Но и тут в последнее время я вижу тень улучшения. В последнее время его насмешки не так язвительны, и есть один монах, которого он принимал и долго говорил с ним.
– Ну, мой друг, я боюсь, что вы с монахом даром растрачиваете свой порох, – насмешливо, но ласково сказал князь Андрей.