Hypothesis: Type families which result in Constraint
s are always distributive over their representational
parameters.
As an example, Fam x Eq `And` Fam x Show
is equivalent to Fam x (Eq `And` Show)
if Fam
's second parameter has a representational role.
Questions:
Intuitively, this breaks down if Fam x c
uses c
in a contraviariant way.
This is now possible using quantified constraints. E.g.
Fam x c = (forall a. c a => D a x)
for some D a x :: Constraint
.
(I think this is representational
, even if I'm not completely positive.)
Hence Fam x (Show `And` Eq)
would mean
forall a. (Show a, Eq a) => D a x
while (Fam x Eq, Fam x Show)
would mean
( forall a. (Show a) => D a x
, forall a. (Eq a) => D a x )
The two constraints are not equivalent. For instance, if D a x = (Show a, Eq a)
the former is trivially satisfied, while the latter is not.