
Think of the following though experiment. What if I would have a function "unparse:IO a->String" which gives the textual representation of the specification of the object of type IO a? Clearly, IO is not a monad anymore. Moreover, I don't think it would break the purity of Haskell. And surely, in case of the IO monad, we can think of better manners to break a program down.
Why would such a function cause IO to cease being a monad? There's no reason such a function couldn't be written, given an appropriate implementation of IO, and an implementation that is able to print a representation of a function (not too difficult for an interpreter). Imagine adding "deriving Show" to the data types IO and SysCall suggested by Ross Paterson in <20030813092707.GA1151@soi.city.ac.uk>. --KW 8-)