# layers-0.1: Modular type class machinery for monad transformer stacks.

The `layers`

package provides the type class machinery needed to make monads
built out of stacks of monad transformers easy to use. It introduces the
concept of monad layers, which are a generalisation of monad transformers.
The type class machinery provided by and the design patterns suggested by
`layers`

allow for much more modularity than is possible with the existing
type class machinery and design patterns. With `layers`

it is possible to
use arbitrary monad interfaces (monad interfaces are what we call the sort
of type classes that you see in the `mtl`

and similar packages) with
arbtirary monad transformers (by monad transformers here, we are
specifically to monad constructors, such as the ones defined in
`transformers`

), without ever having to explicitly define how to lift
specific interfaces through specific transformers.

`layers`

improves upon and/or replaces, in part or in whole, the following
list of packages: `transformers`

, `mtl`

, `mmtl`

, `transformers-base`

,
`monad-control`

, `lifted-base`

, `monad-peel`

, `MonadCatchIO-transformers`

,
`MonadCatchIO-mtl`

, `exception-transformers`

, `monad-abort-fd`

and probably
more too. There have been many attempts to either improve upoin or work
around the deficiencies of the existing type class machinery for monad
transformer stacks, but we believe `layers`

is the most complete of any of
these so far.

A comprehensive overview of the motivation behind `layers`

and an
explanation of the design decisions taken is given in
Documentation.Layers.Overview. It is *highly recommended* that you read
this if you are considering using this package. The core type classes of the
package are defined in Control.Monad.Layer (this can be thought of as
equivalent to or a replacement of Control.Monad.Trans.Class from
`transformers`

). The rest of the modules in this package export monad
interfaces, in the Control.Monad.Interface hierarchy, including
replacements for all of the monad interfaces of the `mtl`

package.

- Control
- Monad
- Interface
- Control.Monad.Layer

- Monad
- Documentation