如何编写forall
约束,例如某些类型系列F
和G
:
forall x y. G (F x y) ~ (x, y)
是否可以使用Edward A. Kmett Constraints
包裹?如果是这样,可以提供一个小例子吗?我认为我需要使用Forall
。
答案 0 :(得分:6)
是的,可以使用constraints
。但要小心!如果类型族是非平凡的,那么你声称的平等对于constraints
来说不太可能具有足够的一般性。特别考虑,当x
和y
是卡住类型的家庭时,类型系列是否成功减少
type family X where {}
type family Y where {}
另外,我发现你特定的期望约束没有任何自由变量。希望它只是一个例子;像这样的实际封闭约束不太可能有用。
Data.Constraint.Forall
中的基本类型系列是Forall
。使用ForallT
可以更方便地处理此特定示例,但了解如何使用Forall
最重要。
通常,Forall p
表示forall x . p x
。这听起来并不普遍,但实际上,如果你逐步建立p
。你寻求
forall x y. G (F x y) ~ (x, y)
首先定义一个表达你所寻求的关系的类。
class G (F x y) ~ (x, y) => C x y
instance G (F x y) ~ (x, y) => C x y
现在你可以一步一步地定义
class Forall (C x) => D x
instance Forall (C x) => D x
(您可以将其视为D x = forall y . C x y
)
然后使用Forall D
(即forall x . D x
)来表达您的约束。您需要使用inst
获取Dict (D x)
并再次使用Dict (C x y)
。