Монады должны управлять потоком данных, как абстрактные типы данных для данных.
Другими словами, многим разработчикам нравится идея наборов, списков, словарей (или хешей, или карт) и деревьев. Внутри этих типов данных существует много особых случаев (например, InsertionOrderPreservingIdentityHashMap).
Однако, когда сталкиваются с «потоком» программы, многие разработчики не сталкиваются с гораздо большим количеством конструкций, чем if, switch / case, do, while, goto (grr) и (возможно) замыкания.
Итак, монада - это просто конструкция потока управления. Лучшей фразой для замены монады будет «тип управления».
Как таковая, монада имеет слоты для логики управления, или операторов, или функций - эквивалент в структурах данных будет означать, что некоторые структуры данных позволяют вам добавлять данные и удалять их.
Например, монада if:
if( clause ) then block
в самом простом случае имеет два слота - предложение и блок. Монада if
обычно создается для оценки результата предложения и, если не ложно, для оценки блока. Многие разработчики не знакомы с монадами, когда они изучают «если», и просто нет необходимости понимать монады, чтобы писать эффективную логику.
Монады могут становиться более сложными, так же, как структуры данных могут становиться более сложными, но существует много широких категорий монад, которые могут иметь сходную семантику, но отличающиеся реализации и синтаксис.
Конечно, точно так же, как структуры данных могут повторяться или проходить через монады.
Компиляторы могут иметь или не иметь поддержку пользовательских монад. Хаскелл, конечно, делает. Ioke имеет некоторые схожие возможности, хотя термин «монада» в языке не используется.