我想要一个表示属性P x
的类,并且我具有形式A x or B x => P x
的含义。
我尝试实现如下:
class P x
instance A x => P x
instance B x => P x
然而,如果A x
和B x
都保持,则这在重叠实例中失败。
(我在处理自然数、Max和Min函数时遇到了这个问题)
表达这种约束的正确方式是什么?
@李耀霞说你不能这样做是正确的@Chi的解释并不是怎么回事。实例decl中的=>
不是蕴涵(至少在Prolog意义上不是)。
instance A x => P x
意味着x
是类P
的实例。通常,x
将是像Int
这样的具体类型,或者至少是一个具有像Maybe a
这样的参数变量的类型构造函数。=>
然后说:对于类型x
,P
的实例需要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认为它们需要任何形式的不确定性是错误的:如果你试图编写不确定性的重叠实例,通常程序会被拒绝。除非你打开各种危险的扩展。)