假设我有以下课程:
class P a where
nameOf :: a -> String
我想声明这个类的所有实例都是自动的Show
。我的第一次尝试如下:
instance P a => Show a where
show = nameOf
我昨天第一次尝试这种方式导致了语言扩展的兔子沃伦:我首先被告知要打开灵活实例,然后是不可判定实例,然后是重叠实例,最后得到关于重叠实例声明的错误。我放弃并返回重复代码。然而,从根本上来说,这似乎是一个非常简单的需求,应该很容易满足。
所以,两个问题:
- 有没有一种我刚刚错过的简单的方法来做到这一点?
- 为什么会出现重叠实例问题?我知道为什么我可能需要
UndecidableInstances
,因为我似乎违反了帕特森条件,但这里没有重叠的实例:P
甚至没有 的实例。为什么类型检查器认为有多个实例Show Double
(在这个玩具示例中似乎就是这种情况)?