December 27, 2005

Що таке монади?

All About Monads
Using Monads

Монада - це спосіб подання обчислень у вигляді значень і послідовностей обчислень з використанням цих значень. Монади дають змогу програмістам будувати обчислення з використанням зовні послідовнісного синтаксису (аля імперативного програмування) - виглядає як послідовність операторів, але зберігає строгість функціонального підходу. Монада визначає як комбіновані обчислення формують нові обчислення і звільняє програміста від ручного кодування таких комбінацій.

Зручно розглядати монаду як стратегію комбінування обчислень у більш складні обчислення. Наприклад є відома у 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:

Sergi said...

Ще один спіч про монади в рунеті: http://y-combinator.blogspot.com/2005/12/blog-post.html