I was thinking about this yesterday. If the point of functional code is that it is easier to reason about, should we like Monads? Consider we have an interpreter, and that we construct a sequence of commands in the free monad. Given a program like this: f = do s <- newRef writeRef s 23 writeRef s 42 readRef s Now I have deliberately not specified the implementation of the interpreter, it could be