In the example:
return "4" >>= ioRead
You could consider adding an explanation, like “Remember that return "4" returns an IO String, >>= unwraps that and passes the string value to ioRead, which reads the string and returns an IO Int.”
It may just be me getting confused, but I had to think it over twice to see it.