Я бы предпочел определить экземпляр Monad через функцию join вместо >> =... Начиная с этой эквивалентности:
x >>= f = join (fmap f x)
так что вы можете определить экземпляр Monad только для соединения?
Я ожидал бы присоединиться к Монаде с помощью: {-# MINIMAL (>>=)| join #-} {-# MINIMAL (>>=)| join #-}
Почему join на верхнем уровне и даже не в стиле Monad?