No, not really. I addedJerzy seemed to suggest that the "impurity" of IO was somehow related to it not supporting very many operations.
First, it is not true that you can do with, say, (printStr "Ho!" ) whatever you want. In fact, you can do almost nothing with it. You can transport it "as such", and you can use it as the argument of (>>=).
You can do whatever you want with them with no harmful effects in any Haskell expression.
Interesting. I wonder how.One could simply implement IO as a free monad