Haskell library for constraint programming, based on two-level types as used in Sheard's Generic Unification paper