Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 重叠实例可以,但仍然失败_Haskell_Typeclass - Fatal编程技术网

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 [

当我在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
实例中使用一段代码,在其余实例中使用另一段代码)

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

因为你是用布拉格语说的


请注意,就GHC的实例解析而言,这些实例不仅仅是重叠的,它们是相同的。GHC根本不知道如何区分这些实例,因此拒绝了它们。甚至
不连贯性
对GHC也没有帮助。这将有助于GHC 7.8,就像我一样

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

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

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

因为你是用布拉格语说的


请注意,就GHC的实例解析而言,这些实例不仅仅是重叠的,它们是相同的。GHC根本不知道如何区分这些实例,因此拒绝了它们。甚至
不连贯性
对GHC也没有帮助。这将有助于GHC 7.8,就像我一样

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


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

不连贯性
在7.8中会有所帮助:
不连贯性
在7.8中会有所帮助:给出了一些处理方法,但是对于那些选项,你基本上必须列出
Eq
中的类型。给出了一些处理方法,但对于这些选项,您基本上必须列出
Eq
中的类型。