假设我有以下类:哈斯克尔继承类型类
class P a where
nameOf :: a -> String
我想声明的是这个类的所有实例都自动的Show
实例。我第一次尝试将是如下:
instance P a => Show a where
show = nameOf
我第一次走这条路昨天导致语言扩展的养兔场的尝试:我是第一次告知要灵活的情况下切换,那么不可判定的情况下,则可以重叠的情况下,最后得到一个关于重叠实例声明的错误。我放弃了,然后回到重复的代码。然而,这从根本上看似乎是一个非常简单的需求,而且应该很容易满足。
于是,两个问题:
- 有一个平凡简单的方法来做到这一点,我刚刚错过?
- 为什么我会遇到重叠实例问题?我可以明白为什么我可能需要
UndecidableInstances
,因为我似乎违反了Paterson条件,但是在这里没有重叠的情况:甚至没有P
的实例。为什么typechecker认为有多个实例Show Double
(在这个玩具的例子中似乎是这种情况)?
重叠(和重载分辨率)仅由实例头部'Show a'确定,所以它确实与其他每个Show实例重叠。 – augustss 2013-04-04 10:03:23
假设你声明了'P Int'的实例,并且你已经有了'Show Int'的实例,所以这将导致Show的重叠实例。 – Satvik 2013-04-04 10:06:09
@Satvik当然,除了我没有'P Int'的实例。如果我试图创建一个'P Int',我会期待一个错误,但不是仅仅声明它可能存在。 – Impredicative 2013-04-04 10:14:13