Is it just me, or is di/uo much more straightforward than all this monad stuff going on in the functional community? The "Clean" functional programming language has 'uniqueness types' which are basically the same as di/uo. I must say I find I/O in Clean rather easier to use than monads.