I think it's fairly misleading to think of impure computation as a core part of the `Monad` abstraction in Haskell[0]. Most of the places I use monads in Haskell are pure e.g. error handling, parsers, working with DSLs. `IO` is where the impurity lives and the monad abstraction just makes it a bit more fun to use, but it isn't essential to the impurity. Haskell had IO before it had monads. I also feel like the emphasis on the Monad abstraction really sells Functor and Applicative short as they are fantastic abstractions in their own right in addition to being important building blocks for the Monad abstraction.