In general, if you want to dynamically generate actions depending on the result of an earlier action you will always encounter join/(>>=).
For example (with ReadPrec/Parser): 
I want to first parse a character, and then parse the same character two more times.
numberAndThenThatManyAs = join (fmap (\c -> satisfy (==c) *> satisfy (==c)) char)

Of note:
* The example is contrived for simplicity's sake, but you do really need a Monad (and hence join) to perform stuff like this in general. A more practical example would be parsing command-line options that depend on previous options.
* Obviously it's way more humane to write this with do-syntax. (or (>>=) or something) - do { c <- char; satisfy (==c); satisfy (==c) }
* I'm not actually sure whether you need a Monad in this situation, maybe you could get away with just selectives

=======
Georgi