One question for the author: monads are not just a tool for IO but form a coherent abstraction over all side-effects. In my Haskell code, I personally have used monads for applications including parsing, fallible operations, IO, random number generation and testing, amongst others. For me, the most useful feature of monads is that they act as a coherent abstraction, allowing me to write code which can work over any of these domains. How does the author propose to replace this?