Монада - це спосіб подання обчислень у вигляді значень і послідовностей обчислень з використанням цих значень. Монади дають змогу програмістам будувати обчислення з використанням зовні послідовнісного синтаксису (аля імперативного програмування) - виглядає як послідовність операторів, але зберігає строгість функціонального підходу. Монада визначає як комбіновані обчислення формують нові обчислення і звільняє програміста від ручного кодування таких комбінацій.
Зручно розглядати монаду як стратегію комбінування обчислень у більш складні обчислення. Наприклад є відома у Haskell монада Maybe:
data Maybe a = Nothing | Just a
що представляє собою спосіб обчислень, які можуть не повернути результату. Maybe тип пропонує стратегію комбінування обчислень, які повертають Maybe значення: якщо комбіноване обчислення скаладаєтсья з одного обчислення B, яке залежить від результату іншого обчислення A, тоді комбіноване обчислення повинно видати Nothing якщо одне з A чи B видає Nothing і комбіноване обчислення повинно видати результат обчислення B з аргументом A, якщо обидва обчислення не повертають Nothing.
Інші монади призначені для формування операцій введення/виведення, якщо операції повиння мати стан, можуть повертати багато результатів тощо. Існує стільки монадичних типів, скільки існує стратегій для комбінування обчислень, деякі особливо корисні і достатньо широко використовувані включено в стандартні бібліотеки Haskell 98.
У Haskell монада задається: 1. Конструктором типу (позничимо m) 2. Функцією, яка створює значення цього типу (типу a -> m a) - return 3. Функцією, яка комбінує значення цього типу з обчисленнями, які повертають значення цього ж типу аби повернути нове обчислення для значень цього типу... бррр..... (m a -> (a -> m b) -> m b) - >>=
-- the type of monad m data m a = ...
-- return is a type constructor that creates monad instances return :: a -> m a
-- bind is a function that combines a monad instance m a with a computation -- that produces another monad instance m b from a's to produce a new -- monad instance m b (>>=) :: m a -> (a -> m b) -> m b
"Що таке монади?"
1 Comment -
Ще один спіч про монади в рунеті: http://y-combinator.blogspot.com/2005/12/blog-post.html
1:27 PM