If you are not afraid to use GHC-specific extensions, then there is no unnecessary approach to monad transformers:
{-
Now you can use ask and local to access the reader data. To trigger an action in the Snap monad, you need to βraiseβ it into your new monad.
... r <- liftSnap $ ... snap action ...
However, you may prefer a shorter name. So maybe just a Snap .
source share