1

当我在 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而将另一段代码用于其余实例)?

4

1 回答 1

4

“可是为什么说重叠没问题呢?”

因为你用语言杂注告诉它。

请注意,就 GHC 的实例解析而言,这些实例不仅仅是重叠的,它们是相同的。GHC 根本无法区分这些实例,因此它拒绝它们。甚至还没有IncoherentInstances帮助 GHC。正如Joachim Breitner 刚刚通知我的那样,它将在 GHC 7.8 中有所帮助。

最后,我打算在当前的 GHC 中以另一种方式实现吗(我打算将一段代码用于实例,Eq而将另一段代码用于其余实例)?

如果新的 costraint 种类扩展能够使它成为可能,我不会感到惊讶,但我从未使用过它们,所以我不知道它们是如何工作的以及它们能做什么。但是你的代码看起来不会那么简单,如果它可以工作的话。

于 2013-09-04T14:02:09.063 回答