As you’ve read through this book, there have been a number of monads that have appeared:
YesodDB (for Persistent). As with most monads, each
one provides some specific functionality:
access to the request and allows you to send responses, a
YesodDB let’s you make database queries. In Model-View-Controller (MVC)
terms, we could consider
YesodDB to be the model,
Widget to be the view, and
Handler to be the controller.
So far, we’ve presented some very straightforward ways to use these monads: your main
handler will run in
runDB to execute a
defaultLayout to return a
Widget, which in turn was created by calls to
However, if we have a deeper understanding of these types, we can achieve some fancier results.
Monads are like onions. Monads are not like cakes. Shrek, more or less
Before we get into the heart of Yesod’s monads, we need to understand a bit about monad
transformers. (If you already know all about monad transformers, you can likely skip
this section.) Different monads provide different functionality:
Reader allows read-only access to some piece of data
throughout a computation,
Error allows you to
short-circuit computations, and so on.
Oftentimes, however, you would like to be able to combine a few of these features together. After all, why not have a computation with read-only access to some settings variable, ...