I'm seeing that the first expression inside an mdo is always evaluated, which may execute side-effects before the monad is run.
For example:
(mdo
failure <- (throw (RuntimeException. "AHA!"))
_ <- (right :something)
:success)
This throws the runtime exception before I try to execute it with monads.core/run-monad