В настоящее время GHC реализует >> как
(>>) :: m a -> m b -> m b
m >> k = m >>= \_ -> k
Почему бы не сделать следующее:
(>>) :: m a -> m b -> m b
m >> k = m *> k
Прямо сейчас, я думаю, что >>= делает что-то *> не делает.
Но все работает грамматически (как, например, по типу), поэтому очень трудно понять, почему это не сработает. Возможно, экземпляр monad выполняет некоторые вычисления, которые нет в аппликативном экземпляре, но я думаю, что это нарушит семантику этого типа.
Обновление. Я получаю только один ответ SO, как принято, но ответ dfeuer очень проницателен (особенно для людей, которые, как и я, относительно неопытны в Haskell).