& package:constraints

due to the hack for the kind of (,) in the current version of GHC we can't actually make instances for (,) :: Constraint -> Constraint -> Constraint, but we can define an equivalent type, that converts back and forth to (,), and lets you hang instances.
Constraint product
trans weaken1 (f &&& g) = f
trans weaken2 (f &&& g) = g