We're still compiling for 7.8 which is pre-AMP, so let's just be explicit about it so we can use applicative notation.
This can be instantiated by both an IO monad or a pure State monad.