I have some questions about the definition of the binding function (>>=) in Haskell.
Because Haskell is a pure language, so we can use Monad to handle operations with side effects. I think this strategy is somewhat like putting all actions may cause side effects to another world, and we can control them from our "pure" haskell world though do or >>=.
So when I look at definition of >>= function
(>>=) :: Monad m => m a -> (a -> m b) -> m b
it takes a (a -> m b) function, so result m a of the former action can be "unpack" to a non-monadic a in >>=. Then the function (a -> m b) takes a as its input and return another monadic m b as its result. By the binding function I can operate on monadic without bringing any side effects into pure haskell codes.
My question is why we use a (a -> m b) function? In my opinion, a m a -> m b function can also do this. Is there any reason, or just because it is designed like this?
EDIT
From comments I understand it's hard to extract a from m a. However, I think I can consider a monadic m a as a a with side effect.
Is it possible to assume function m a -> m b acts similar with a -> b, so we can define m a -> m b like defining a -> b?