组合约束?

问题描述 投票:0回答:1

我正在寻找一种方法来组合两个(或更多)约束,使得

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

我想知道这是否真的可能,或者有什么好的解决方法。

haskell constraints combinators
1个回答
0
投票

事实上

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
© www.soinside.com 2019 - 2024. All rights reserved.