我被这个重叠的实例错误消息难住了。抱歉,这是一个不平凡的项目,但错误应该是类型签名的本地错误。
首先,我声明f是某种类型,
let f = undefined :: (CompNode Int)
然后,我尝试pshow :: PrettyShow a => a -> String
在它上面调用我的函数。我收到此错误消息。
> pshow f
<interactive>:1:1:
Overlapping instances for PrettyShow (CompNode Int)
arising from a use of `pshow'
Matching instances:
instance (G.Graph g, PrettyShow (G.Vertex g)) => PrettyShow g
-- Defined at Graph.hs:61:10-57
instance (PrettyShow a, Show a) => PrettyShow (CompNode a)
-- Defined at Interpreter.hs:61:10-58
问题是那CompNode Int
不是图表,所以我认为第一个匹配实例不应该触发。(第二个是我想要执行的。)事实上,如果我写一个函数,它的参数是一个图,
> :{
| let g :: G.Graph a => a -> a
| g = id
| :}
然后在f上调用它,我得到预期的 no instance 错误消息,
> g f
<interactive>:1:1:
No instance for (G.Graph (CompNode Int))
在此先感谢,抱歉众包。我正在使用 GHC 7.0.4。