> having to add IO effects to all functions

Sound like Haskell, and its Monads. I think it does end up being very similar in the end.

Would you compare effects and monads?

I came here to ask the same question; did somebody just reinvent monads?

Also note that much of Haskell now uses MonadIO, so you are no longer constrained to IO or having to manually lift IO into your monad, so long as your monad instances MonadIO. This makes code reuse across libraries trivial. I say this because their div() example says that it can only be called from an Exception effect context, which is like old-school IO-everywhere Haskell. It seems to me like they're going to run into the function colour problem.