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