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
.