Глядя на источник для Монады:
class Monad m where
(>>=) :: forall a b. m a -> (a -> m b) -> m b
(>>) :: forall a b. m a -> m b -> m b
return :: a -> m a
fail :: String -> m a
{-# INLINE (>>) #-}
m >> k = m >>= \_ -> k -- <-- !! right here !!
fail s = error s
Вы можете видеть, что >>
имеет реализацию по умолчанию. Мой вопрос в том, считается ли это хорошей или плохой практикой и почему, чтобы включить функцию/комбинатор в класс, вместо того, чтобы предоставлять его отдельно за пределами класса?
То есть, почему бы и нет:
class Monad m where
(>>=) :: forall a b. m a -> (a -> m b) -> m b
return :: a -> m a
fail :: String -> m a
fail s = error s
и где-то еще:
(>>) :: forall a b. m a -> m b -> m b
{-# INLINE (>>) #-}
m >> k = m >>= \_ -> k