当我在Haskell中输入以下内容时:
{-# LANGUAGE FlexibleInstances, OverlappingInstances, UndecidableInstances #-}
class Class a
instance Class a
instance Eq a => Class a
当我将其加载到GHCi中时出现此错误:
Test.hs:5:10:
Duplicate instance declarations:
instance [overlap ok] Class a -- Defined at Test.hs:5:10
instance [overlap ok] Eq a => Class a -- Defined at Test.hs:6:10
Failed, modules loaded: none.
我理解为什么它失败了,看到它们都是a
的实例,并且两者都没有更具体,假设忽略了约束。但为什么说重叠是好的?
此外,是否可以添加语言扩展以允许这些重叠工作并且这是否有用?
最后,我想用另一种方式在当前的GHC中做什么(我打算用Eq
的实例代替一部分代码而另一部分用另一部分代码?
答案 0 :(得分:4)
“但为什么说重叠是好的?”
因为你用语言编译语告诉了它。
请注意,就GHC的实例解析而言,这些实例不仅仅是重叠的,它们是相同的。 GHC根本无法区分这些实例,因此它拒绝它们。甚至IncoherentInstances
都没有帮助GHC。这将有助于GHC 7.8,Joachim Breitner just notified我。
最后,我想用另一种方式在当前的GHC中做什么(我打算用
Eq
的实例代替一部分代码而另一部分用另一部分代码?
如果新的costraint种类扩展能够实现,我不会感到惊讶,但我从未与它们合作过,所以我不知道它们是如何工作的以及它们能做什么。但是,如果它的工作原理,你的代码看起来就不那么简单了。