重叠实例确定,但仍然失败

时间:2013-09-04 13:47:00

标签: haskell typeclass

当我在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的实例代替一部分代码而另一部分用另一部分代码?

1 个答案:

答案 0 :(得分:4)

  

“但为什么说重叠是好的?”

因为你用语言编译语告诉了它。

请注意,就GHC的实例解析而言,这些实例不仅仅是重叠的,它们是相同的。 GHC根本无法区分这些实例,因此它拒绝它们。甚至IncoherentInstances都没有帮助GHC。这将有助于GHC 7.8,Joachim Breitner just notified我。

  

最后,我想用另一种方式在当前的GHC中做什么(我打算用Eq的实例代替一部分代码而另一部分用另一部分代码?

如果新的costraint种类扩展能够实现,我不会感到惊讶,但我从未与它们合作过,所以我不知道它们是如何工作的以及它们能做什么。但是,如果它的工作原理,你的代码看起来就不那么简单了。