
The favourite customer for FDs has been the monad transformer library. (There are at least two versions, but they have the same requirements.) In this library, all the dependencies are full, i.e. involve all (both) the arguments of the class, e.g. class (Monoid w, Monad m) => MonadWriter w m | m -> w Instances of these classes are of two kinds: 1) Base cases: the range argument is a variable that occurs in the domain argument, e.g. instance (Monoid w, Monad m) => MonadWriter w (WriterT w m) 2) Inductive definitions: the range argument is a variable that is determined by variables in the domain argument via an FD (on the same class) in the context of the instance, e.g. instance (Error e, MonadWriter w m) => MonadWriter w (ErrorT e m) What other libraries should Haskell' support, and what are their requirements?