Из Haskell wiki:
Монады можно рассматривать как стандартный программный интерфейс для различных данных или структур управления, которые захватываются классом Monad. Все общие монады являются его членами:
class Monad m where (>>=) :: m a -> (a -> m b) -> m b (>>) :: m a -> m b -> m b return :: a -> m a fail :: String -> m a
В дополнение к реализации функций класса все экземпляры Монада должна подчиняться следующим уравнениям или законам Монады:
return a >>= k = k a m >>= return = m m >>= (\x -> k x >>= h) = (m >>= k) >>= h
Вопрос: Являются ли три закона монады внизу фактически принудительно введены языком? Или это дополнительные аксиомы, которые вы должны выполнять, чтобы ваша языковая конструкция "Монады" соответствовала математической концепции "Монады"?