我想要一个代表属性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
同时成立,则重叠的实例将失败。
(我在处理自然数,最大和最小函数时遇到了这个问题)
表达此约束的正确方法是什么?
答案 0 :(得分:0)
@ Li-yaoXia正确地说您不能这样做。 @Chi的解释不是怎么回事。实例decl中的=>
不是暗示(至少不是Prolog意义上的意思)。
instance A x => P x
手段x
是类P
的实例。通常,x
将是具体类型,例如Int
,或者至少是带有参数变量的类型构造函数,例如Maybe a
。 =>
然后说:对于类型x
,P
的一个实例需要A x
。也就是说,其含义与外观相反。
认为(首先检查所有约束是否成立然后检查实例头是否成立)是一个(常见的)新手错误。
然后也有
instance B x => P x
表示x
是P
的实例;还需要B x
。因此,如果要编译两个实例,则需要(P x) IMPLIES ((A x) AND (B x))
。也就是说,与
instance (A x, B x) => P x
但是您的实例无法编译。因为他们的两个头是相同的P x
;这是重复的。 (我希望不是重叠的实例错误,而是重复的实例错误。)
重叠的实例与这里发生的事情无关。 (但是@Chi暗示他们需要任何不确定性是错误的:如果您尝试编写不确定性重叠实例,通常该程序会被拒绝。除非您打开各种危险的扩展名。)