Re: Монады
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 27.10.14 14:16
Оценка:
Здравствуйте, AlexRK, Вы писали:

ARK>Товарищи!


ARK>Может кто-нибудь описать простым языком — что такое монады и зачем они нужны?


ARK>Сколько ни видел в интернете трудов наподобие "простое описание монад" — никто не может описать доходчиво. Везде одна и та же хрень: "я понял монады!" и начинается "это тип с операциями bind и return", бла-бла-бла.


ARK>Или монады это такая сложная концепция, что описать ее доступным языком невозможно в принципе?


Монада это паттерн (то есть "узаконенная копипаста"). В отличие от всех остальных паттернов монады формализованы, то есть подчиняются некоторым математическим формулам.
Этот паттерн состоит из трех частей — монадного типа M<T> , функции bind и фукнции return. bind и return должны подчинаться трем монадным законам.

Основное предназначение паттерна — композиция функций T -> M<V>.
Таких функций на практике очень много:
1) M<T> — Future<T>\Task<T>, получаем механизм композиции асинхронных вычислений
2) M<T> — Option<T> — получаем механизм композиции вычислений, со значениями, которые могут отсуствовать
3) M<T> — IEnumerable<T> получаем механизм композиции последовательностей (списками)
...
Есть и более экзотические варианты M<T> — парсеры, значения с погрешностями, случайные величины и даже состояние, в том числе потокобезопасное.

Но сам по себе паттерн "монада" был бы не нужен никому, если бы не поддержка в языках.
Формальное определение паттерна позволяет в языки встроить "монадный синтаксис" (aka do-нотация, aka linq). Этот синтаксис позволяет вложенные вызовы bind записывать в линейной форме.

Преимущество монад в том, что вся сложность спрятана внтури функции bind, все остальное обычно — чистые функции, которые гораздо легче писать и они вызывают гораздо меньше ошибок.

Еще одна фишка монад — дуальность. Имея некоторую монаду M, можно построить дуальную монаду M` просто "развернув стрелочки".

Вообще фишек у монад много, но они скорее интересны для академического изучения, а не для практического применения.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.