> If you worry about nondeterminism, we can imagine that the input value
> of World is evaluated lazily and as a whole is infinite. Some parts of
> it depend on the output of our Haskell program, but it's not unusual
> in a lazy world for a value to be expressed in terms of the result of a
> function it is passed to as the argument. It happens that when the part
> of World that says which character is to be read must be evaluated,
> the character has already been read. I think this point of view has
> something in common with the old Haskell's model of I/O: lazy streams.
Yes, you can also argue about whether this World value is 3-dimensional,
4-dimensional, N-dimensional, deterministic, nondeterministic, etc. The
point is that it all starts to get rather hairy when you start thinking
about IO functions in such a way, and then start drawing philosophical
conclusions about what it "means".
My original intent was to say that if you describe 'IO a' values simply
as _unevaluated_ imperative actions and throw away notions of
referential transparency and World states, then *poof* no more nasty
philosophy debates. :-)
- Michael Hobbs