Хорошо, используя терминологию и примеры на Haskell ...
Монада в функциональном программировании - это составной шаблон для типов данных с видом * -> *
.
class Monad (m :: * -> *) where
return :: a -> m a
(>>=) :: m a -> (a -> m b) -> m b
(В Хаскелле есть нечто большее, чем класс, но это важные части.)
Тип данных является монадой, если он может реализовать этот интерфейс, удовлетворяя при этом трем условиям реализации. Это «законы монады», и я оставлю это для этих многословных объяснений для полного объяснения. Я суммирую законы так: «(>>= return)
является тождественной функцией, а (>>=)
является ассоциативным». Это действительно не более того, даже если это можно выразить более точно.
И это все это монада. Если вы можете реализовать этот интерфейс, сохранив эти поведенческие свойства, у вас есть монада.
Это объяснение, вероятно, короче, чем вы ожидали. Это потому, что интерфейс монады действительно очень абстрактный. Невероятный уровень абстракции является частью того, почему так много разных вещей можно смоделировать как монады.
Что менее очевидно, так это то, что, как бы ни был абстрактен интерфейс, он позволяет обобщенно моделировать любой шаблон потока управления независимо от фактической реализации монады. Вот почему пакет Control.Monad
в библиотеке GHC base
имеет такие комбинаторы, как when
, forever
и т. Д. И именно поэтому возможность явного абстрагирования над любой реализацией монады является мощной, особенно с поддержкой системы типов .