The Layer data type.
A monad is constructed from a list of layers.
Each layer adds a corresponding set of non-proper
morphisms (npms) for use in the monad. The non-proper morphisms
can be thought of as the interface of the monad or
primitives in the constructed monad "language".

Constructors

Io

The Io layer.
Adds an npm for IO operations.

List

The List layer.
Adds an npm for expressing nondeterministic computation.

The Continuation layer.
f no List layer is included in the li , then the corresponding Layer transformers are composed Adds an npm for accessing current continuation to facilate
continuation passing style programming.

The monad type. Each component contains abstract
syntax of the Haskell code to implement the monad.
Components are (code for the data type, code for the return, code for the
bind, code for the non-proper morphisms, code for the monad lifting)