Add Applicative instances for MTL types

Ross Paterson ross at
Wed Jan 14 08:50:54 EST 2009

On Wed, Jan 14, 2009 at 01:54:47PM +0100, Bas van Dijk wrote:
> On Sat, Dec 20, 2008 at 7:09 PM, Bas van Dijk <v.dijk.bas at> wrote:
> > In a project of mine I needed an Applicative instance for Identity and
> > noticed it didn't exist. So I decided to add Applicative (and
> > Alternative instances where possible) for all MTL types.
> >
> > When I was about to submit a library proposal I saw there already
> > existed one. So I added my patch to that ticket.
> >
> > My patch I different in that my Applicative instances don't require a
> > Monad constraint. This also means that most Functor instances now also
> > depend on Applicative rather than on Monad.
> >
> > See the ticket for the details:
> >
> >

The Functor instances could depend on Functor rather than Applicative.

Even though Applicative is not a superclass of Monad, I think we ought to
ensure that the instances are compatible.  That is, if an Applicative
is also a Monad, then we should have pure = return and (<*>) = ap.
This fails for your ErrorT instance: ap runs the second computation
only if the first succeeded, while (<*>) runs them both before checking
for errors.  It needs a Monad constraint (like StateT), though not an
Error constraint.

> * Can we get rid of the Monad and MonadPlus constraints in the
> Applicative and Alternative instances for StateT and RWST?

I don't think so: you need part of the value generated by the first
computation, namely the state (inside the f), to construct the second one.
You can do that in a Monad, but not in an Applicative.

At Henning Thielemann's request, I've recently put up on hackage a
restructuring of the mtl into three packages, to provide three different
interfaces to the same monad transformers:

transformers: a Haskell 98 package with the MonadTrans class, concrete
	monad transformers, operations and liftings.
monads-fd: multi-parameter monad classes using functional dependencies,
	with instances for these transformers.  (Almost backward-compatible
	with the mtl package.)
monads-tf: monad classes using type families, with instances for these

The first one includes Applicative instances like these.

More information about the Libraries mailing list