分配型约束族的转换
Conversion of distributive type families of constraints
假设:导致 Constraint
的类型族总是分布在它们的 representational
参数上。
例如,如果Fam
的第二个参数具有表示作用,则Fam x Eq `And` Fam x Show
等同于Fam x (Eq `And` Show)
。
问题:
- 以上假设是否真的正确?有没有参考资料?
- GHC 是否允许利用此规则转换等效约束?
直觉上,如果 Fam x c
使用 c
以一种反相的方式,这就会崩溃。
现在可以使用量化约束。例如
Fam x c = (forall a. c a => D a x)
有些 D a x :: Constraint
.
(我认为这是 representational
,即使我不是完全肯定。)
因此 Fam x (Show `And` Eq)
将意味着
forall a. (Show a, Eq a) => D a x
而 (Fam x Eq, Fam x Show)
表示
( forall a. (Show a) => D a x
, forall a. (Eq a) => D a x )
这两个约束不等价。例如,如果 D a x = (Show a, Eq a)
前者是微不足道的满足,而后者则不是。
假设:导致 Constraint
的类型族总是分布在它们的 representational
参数上。
例如,如果Fam
的第二个参数具有表示作用,则Fam x Eq `And` Fam x Show
等同于Fam x (Eq `And` Show)
。
问题:
- 以上假设是否真的正确?有没有参考资料?
- GHC 是否允许利用此规则转换等效约束?
直觉上,如果 Fam x c
使用 c
以一种反相的方式,这就会崩溃。
现在可以使用量化约束。例如
Fam x c = (forall a. c a => D a x)
有些 D a x :: Constraint
.
(我认为这是 representational
,即使我不是完全肯定。)
因此 Fam x (Show `And` Eq)
将意味着
forall a. (Show a, Eq a) => D a x
而 (Fam x Eq, Fam x Show)
表示
( forall a. (Show a) => D a x
, forall a. (Eq a) => D a x )
这两个约束不等价。例如,如果 D a x = (Show a, Eq a)
前者是微不足道的满足,而后者则不是。