
Jake McArthur
The problem with your description is that you said "and then." The result will be generated lazily. There is no sequencing here. Consider:
~ do x <- [0..] ~ y <- [0..9] ~ return (x, y)
Which list is generated first?
This is an implementation detail, since y has no dependency on x the compiler's free to reorder instructions, as it would be an imperative language. Semantically this means do x and then y, since if y is changed to depend on x, this is still valid, but if x is changed to depend on y, this sequence is not valid. Just because the compiler is allowed (and even encouraged) to change the sequence where that won't change the results, considering this a sequence is still valid and meaningful.
| As for Reader, I don't know enough about it to say anything.
Reader provides an immutable value that can be retrieved at any point in the monad. There are no monadic side effects, so it doesn't really mean much to say that anything happens in any particular order.
It still needs to be retrieved (logically, not necessarily temporally) before it's used, doesn't it?
- Jake