В настоящее время 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).