
I think I have a very similar problem to the currently discussed "WriterT [w] IO is not lazy in reading [w]". I want to defer IO actions, until they are needed, but they shall be executed in order. If I call unsafeInterleaveIO, they can be executed in any order. I understand that hGetContents does not defer the hGetChar operations but instead defers the call of the (:) constructors, thus preserving the order of the hGetChar calls. In the general case this is not so simple, since the result of a monadic block might not be a list and the result of particular actions might not be needed at all, e.g. (). If it is generally possible to use unsafeInterleaveIO such that it executes actions in the right order, wouldn't this allow the definition of a general lazy IO monad?