[![Build Status](https://travis-ci.org/strake/monad-classes.hs.svg?branch=master)](https://travis-ci.org/strake/monad-classes.hs) See [this series of articles][1] for the detailed description and motivation. [1]: https://ro-che.info/articles/extensible-effects 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 `get`s and `put`s, as soon as different state transformers carry different types of states. Example: ``` haskell 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.