Основы функционального программирования/Haskell/Модули и монады: различия между версиями

Содержимое удалено Содержимое добавлено
→‎Монады: орфография
 
Строка 79:
== Монады ==
 
Многие новички в [[w:Функциональное программирование|функциональном програмированиипрограммировании]] бывают часто озадачены понятием монады в Haskell. Но монады очень часто встречаются в языке: так, например, система ввода-вывода основана именно на понятии монады, а стандартные библиотеки содержат целые модули, посвящённые монадам. Необходимо отметить, что понятие монады в Haskell основано на [[w:Теория категорий|теории категорий]], но чтобы не вдаваться в абстрактную математику, далее будет представлено интуитивное понимание монад.
 
Монады суть типы, представляющие собой экземпляры одного из следующих монадических классов: <code>Functor</code>, <code>Monad</code> и <code>MonadPlus</code>. Ни один из этих классов не может быть предком для другого класса, то есть монадические классы ненаследуемы. В модуле <code>Prelude</code> определены три монады: <code>IO</code>, <code>[]</code> и <code>Maybe</code>, то есть список также является монадой.
Строка 107:
_ -&gt; fail "s")</code>
 
где <code>s</code> — это строка, которая может определять местоположение оператора <code>do</code> в программе, а может просто нести некоторую семантическую нагрузку. Например, в монаде <code>IO</code> действие <code>('a' -&gt; getChar)</code> вызовет функцию <code>fail</code> в том случае, если считанный символ не является символом <code>'a'</code>. Это действие прерывает исполнение программы, так как определённая в монаде <code>IO</code> функция <code>fail</code> в свою очередь вызывает системную функиюфункцию <code>error</code>.
 
Класс <code>MonadPlus</code> используется для тех монад, в которых есть нулевой элемент и операция <code>+</code>. Определение этого класса выглядит следующим образом: