我正在寻找一种方法来组合两个(或更多)约束,使得
Combine c1 c2 a
意味着 c1 a
和 c2 a
,反之亦然。当约束用作输入时,这可能很有用:
data HList constraint where
Empty :: HList constraint
(:*:) :: constraint a => a -> HList constraint -> HList constraint
其中
show
和 negate
可以应用于类型为 HList (Combine Show Num)
的 hlist 的元素。
有了这些要求,
type Combine c1 c2 a = (c1 a, c2 a)
就不行了,因为类型同义词必须是饱和的。我也尝试将 Combine
声明为一个类,但不能暗示 (Combine c1 c2 a) => c1 a
或 c2 a
:
class (c1 a, c2 a) => Combine c1 c2 a
instance (c1 a, c2 a) => Combine c1 c2 a
instance Combine c1 c2 a => c1 a -- error: Illegal head of an instance declaration
instance Combine c1 c2 a => c2 a -- error: Illegal head of an instance declaration
我想知道这是否真的可能,或者有什么好的解决方法。
事实上
Combine c1 c2 a
意味着 c1 a
和 c2 a
已包含在声明中
class (c1 a, c2 a) => Combine c1 c2 a
您想要
Combine
做的一切,只需简单地书写即可完成
class (c1 a, c2 a) => Combine c1 c2 a
instance (c1 a, c2 a) => Combine c1 c2 a