A version of monad transformers that (a) allows one to convince the type checker that transformer application is a monad, and (b) doesn't need lots of boilerplate to add a new transformer. It's supposed to play nicely with `Control.Monad.Trans`

.

In order to make a new transformer (say, `T`

) an instance of `TransM`

(`TransP`

, `TransF`

) class, all you have to do is:

define `instance MonadTrans T`

— which you've probably done already

define `instance Monad m => Monad (T m)`

— also something quite common (for `TransP`

and `TransF`

you'd need another instance for `MonadPlus`

and `MonadFix`

, respectively).

write `instance Trans T where transMInst = instM`

— which is exactly one line of boilerplate. Sorry about that.

After that, you can use your new and shiny transformer in compositions, like `ReaderT Char :. T :. WriterT String`

— and such a composition would automagically become a monad transformer.