Haskell 重叠实例可以,但仍然失败
当我在Haskell中输入以下内容时:Haskell 重叠实例可以,但仍然失败,haskell,typeclass,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 [
{-# 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
实例中使用一段代码,在其余实例中使用另一段代码)
“但为什么说重叠是可以的?”
因为你是用布拉格语说的
请注意,就GHC的实例解析而言,这些实例不仅仅是重叠的,它们是相同的。GHC根本不知道如何区分这些实例,因此拒绝了它们。甚至
不连贯性对GHC也没有帮助。这将有助于GHC 7.8,就像我一样
最后,我打算在当前GHC中以另一种方式实现吗(我打算在Eq
实例中使用一段代码,在其余实例中使用另一段代码)
如果新的costraint类型扩展能够实现这一点,我不会感到惊讶,但我从未与他们合作过,所以我不知道他们是如何工作的,他们能做什么。但是,如果代码能够正常工作,那么它看起来就不会那么简单了
“但为什么说重叠是可以的?”
因为你是用布拉格语说的
请注意,就GHC的实例解析而言,这些实例不仅仅是重叠的,它们是相同的。GHC根本不知道如何区分这些实例,因此拒绝了它们。甚至不连贯性对GHC也没有帮助。这将有助于GHC 7.8,就像我一样
最后,我打算在当前GHC中以另一种方式实现吗(我打算在Eq
实例中使用一段代码,在其余实例中使用另一段代码)
如果新的costraint类型扩展能够实现这一点,我不会感到惊讶,但我从未与他们合作过,所以我不知道他们是如何工作的,他们能做什么。但是,如果你的代码能正常工作的话,它看起来就不那么简单了。不连贯性
在7.8中会有所帮助:不连贯性
在7.8中会有所帮助:给出了一些处理方法,但是对于那些选项,你基本上必须列出Eq
中的类型。给出了一些处理方法,但对于这些选项,您基本上必须列出Eq
中的类型。