A real implementation performs the I/O as the associated monad is evaluated, and relies on lazy evaluation to only evaluate the monad that is returned
@brokenix@emacs.ch Eh... no. You can do arbitrary IO without ever touching monads or something else beyond lambdas.