Forall约束

时间:2016-08-14 19:03:58

标签: haskell equality type-families

如何编写forall约束,例如某些类型系列FG

forall x y. G (F x y) ~ (x, y) 

是否可以使用Edward A. Kmett Constraints包裹?如果是这样,可以提供一个小例子吗?我认为我需要使用Forall

1 个答案:

答案 0 :(得分:6)

是的,可以使用constraints。但要小心!如果类型族是非平凡的,那么你声称的平等对于constraints来说不太可能具有足够的一般性。特别考虑,当xy是卡住类型的家庭时,类型系列是否成功减少

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)