Chapter 18. Monad Transformers
Motivation: Boilerplate Avoidance
Monads provide a powerful way to build computations with effects. Each of the standard monads is specialized to do exactly one thing. In real code, we often need to be able to use several effects at once.
Recall the Parse
type that we developed in Chapter 10, for
instance. When we introduced monads, we mentioned that this type was a
State
monad in disguise. Our monad is more complex than the standard
State monad, because it uses the Either
type to allow the possibility of a parsing failure. In our
case, if a parse fails early on, we want to stop parsing, not continue
in some broken state. Our monad combines the effect of carrying state
around with the effect of early exit.
The normal State monad
doesn’t let us escape in this way; it carries state only. It uses the
default implementation of fail
:
this calls error
, which throws an
exception that we can’t catch in pure code. The State monad
thus appears to allow for failure, without that
capability actually being any use. (Once again, we recommend that you
almost always avoid using fail
!)
It would be ideal if we could somehow take
the standard State monad and add failure handling to it,
without resorting to the wholesale construction of custom monads by
hand. The standard monads in the mtl
library don’t allow us to combine them. Instead, the library
provides a set of monad transformers[39] to achieve the same result.
A monad transformer is similar to a regular monad, but it’s ...
Get Real World Haskell now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.