This is one of those things that functional-programming people seem to "get" without ever making the explanation very clear.
First of all, this is a function declaration (ie. prototype), not a definition. So this is describing a function type, not a function implementation. But that doesn't help very much because it's still not very obvious what the function type means.
The shortcut way to understanding Haskell function declarations is this; if you see:
a -> b -> c -> d
in your head, think of it as:
f(a, b, c) -> d
In other words, it is a function that takes three parameters of types a, b, and c and returns type d. Everything before the final -> is a parameter and the final type is a return type.
My "shortcut" isn't literally true, obviously. Here is the gory detail.
In Haskell, every function takes at most one parameter. Functions of multiple parameters do not exist; they are simulated through a technique called "currying." When you think you're calling a function of more than one parameter, you're actually calling a series of functions, each of which takes exactly one parameter. So in Haskell, if you call:
f a b c
This is actually parsed as
((f a) b) c
Or in more C-like notation:
f(a)(b)(c)
In other words, you call a function with a single parameter "a", which returns a function that you call with a single parameter "b", which returns a function that you call with a single parameter "c."
Likewise, the Haskell type declaration:
a -> b -> c -> d
Is actually right-associative, so it's parsed as:
a -> (b -> (c -> d)))
Which is why the whole thing works.
So to parse:
m a -> (a -> m b) -> m b
Think of it as a function that would be called like so:
f(m a, g) -> m b
Where g is a function that would be called like so:
g(a) -> m b
The "m a" and "m b" business you can think of as being a lot like M<a> and M<b> in C++.