& 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