rework monad evaluation