Effects are pretty smoothly described by monads; there's an entire well-respected language built on top of that.
One of the problems of the purely applicative approach is that you get a nice algebra for describing your results, including the sequence of effects, but reasoning about the resources spent by the computation becomes harder.