重叠实例和ORing约束



我想要一个表示属性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都保持,则这在重叠实例中失败。

(我在处理自然数、Max和Min函数时遇到了这个问题)

表达这种约束的正确方式是什么?

@李耀霞说你不能这样做是正确的@Chi的解释并不是怎么回事。实例decl中的=>不是蕴涵(至少在Prolog意义上不是)。

instance A x => P x

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

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

然后还有

instance B x => P x

意味着CCD_ 15是CCD_;也需要CCD_ 17。因此,如果要编译两个实例,则需要(P x) IMPLIES ((A x) AND (B x))。也就是说,与相同

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

但是您的实例不会编译。因为它们的两个头是相同的CCD_ 19;这是重复。(我预计不是重叠实例错误,而是重复实例错误。)

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

最新更新