more flexible mtl https://github.com/strake/monad-classes.hs
|Latest on Hackage:||0.3.2.2|
This package is not currently in any snapshots. If you're interested in using it, we recommend adding it to Stackage Nightly. Doing so will make builds more reliable, and allow stackage.org to host generated Haddocks.
See this series of articles for the detailed description and motivation.
This is a more flexible version of mtl, the monad transformers library.
You can have many layers of e.g. state transformers in your stack, and you don't have to explicitly lift your
puts, as soon as different state transformers carry different types of states.
a :: (MonadState Bool m, MonadState Int m) => m () a = do put False -- set the boolean state modify (+ (1 :: Int)) -- modify the integer state
mtl requires Θ(n2) instances (like
MonadReader e (StateT s m)); monad-classes requires only Θ(n) of them (where n is the number of different transformer types).
If you'd like to define your own monad-classes-style class, you have to write much less boilerplate code.