@hackage transformers-supply0.1.0

Supply applicative, monad, applicative transformer and monad transformer.

The Supply monad represents a computation that consumes values from a provided supply.

This package comes with two separate implementations, Control.Applicative.Supply and Control.Monad.Trans.Supply. The former provides an applicative and applicative transformer, the latter a monad and monad transformer.

The reason for providing two separate implementations is that the Applicative instance of Control.Monad.Trans.Supply.SupplyT incurs a Monad constraint on the wrapped type, meaning it's not possible to (usefully) wrap a type that only has an Applicative instance.

The implementation of Control.Applicative.Supply.SupplyT has an Applicative instance for wrapped types that are only Applicative, but this implementation cannot be made an instance of Monad, meaning it is less powerful than the version from Control.Monad.Trans.Supply.

In general, use Control.Monad.Trans.Supply unless you're wrapping a type that has no Monad instance, in which case you can fall back to Control.Applicative.Supply.