重叠实例和ORing约束

时间:2019-01-03 12:45:27

标签: haskell types

我想要一个代表属性P x的类,并且具有形式A x \or B x => P x的含义。

我尝试如下实现此目标:

class P x 
instance A x => P x
instance B x => P x

但是,如果A xB x同时成立,则重叠的实例将失败。

(我在处理自然数,最大和最小函数时遇到了这个问题)

表达此约束的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

@ Li-yaoXia正确地说您不能这样做。 @Chi的解释不是怎么回事。实例decl中的=>不是暗示(至少不是Prolog意义上的意思)。

instance A x => P x

手段x是类P的实例。通常,x将是具体类型,例如Int,或者至少是带有参数变量的类型构造函数,例如Maybe a=>然后说:对于类型xP的一个实例需要A x。也就是说,其含义与外观相反。

认为(首先检查所有约束是否成立然后检查实例头是否成立)是一个(常见的)新手错误。

然后也有

instance B x => P x

表示xP的实例;还需要B x。因此,如果要编译两个实例,则需要(P x) IMPLIES ((A x) AND (B x))。也就是说,与

相同
instance (A x, B x) => P x

但是您的实例无法编译。因为他们的两个头是相同的P x;这是重复的。 (我希望不是重叠的实例错误,而是重复的实例错误。)

重叠的实例与这里发生的事情无关。 (但是@Chi暗示他们需要任何不确定性是错误的:如果您尝试编写不确定性重叠实例,通常该程序会被拒绝。除非您打开各种危险的扩展名。)