Restrict type of monadic binding
According to Do notation considered harmful#Safety the type of the monadic binding combinator (>>) should be restricted to
This way, you can omit
(>>) :: m () -> m a -> m a
only if the monadic return value has type
Types of some other monadic operations should be restricted, too.
mapM_ :: Monad m => (a -> m ()) -> [a] -> m () replicateM_ :: Monad m => Int -> m () -> m () sequence_ :: Monad m => [m ()] -> m () zipWithM_ :: Monad m => (a -> b -> m ()) -> [a] -> [b] -> m ()