Class 替换实例声明

Class 替换实例声明,class,haskell,instance,Class,Haskell,Instance,我想替换标准类型的Haskell库的实例声明。例如,将布尔值的Show实例替换为: instance Show Bool where show True = "Vrai" show False = "Faux" 但当我尝试这样做时,我会出现以下错误: Duplicate instance declarations: instance Show Bool -- Defined at Exemples01.hs:37:10 instance Show Bool -- Define

我想替换标准类型的Haskell库的实例声明。例如,将布尔值的
Show
实例替换为:

instance Show Bool where
  show True  = "Vrai"
  show False = "Faux"
但当我尝试这样做时,我会出现以下错误:

Duplicate instance declarations:
  instance Show Bool -- Defined at Exemples01.hs:37:10
  instance Show Bool -- Defined in `GHC.Show'

是否可以用Haskell替换实例声明?

Haskell实例应该是唯一的:在整个程序中,每种类型只能有一个实例

孤立模块可以暂时中断唯一性。孤立项是声明类型实例但不声明类型而不是类的模块。原则上,两个模块可以从第三个模块导入相同的类型,并为其声明不同的实例。直到第四个模块尝试从这两个实例导入,导致两个实例之间发生冲突,从而触发编译器错误,此操作才会“起作用”。因此,在实践中,唯一性最终还是有保证的

大多数标准类型的实例都没有在孤立项中声明,因此在导入标准类型时无法避免导入它们。因此,您只能使用标准实例


有一些Haskell扩展,例如
重叠实例
不连贯性
,它们可以破坏实例的唯一性。我相信大多数哈斯克勒认为这是系统中的疣,而不是积极开发的东西。事实上,当同一类型存在多个实例时,编译器将如何选择就不再清楚了。这使得代码非常脆弱,因此我建议不要试图破坏实例的唯一性。

Haskell实例应该是唯一的:在整个程序中,每种类型应该只有一个实例

孤立模块可以暂时中断唯一性。孤立项是声明类型实例但不声明类型而不是类的模块。原则上,两个模块可以从第三个模块导入相同的类型,并为其声明不同的实例。直到第四个模块尝试从这两个实例导入,导致两个实例之间发生冲突,从而触发编译器错误,此操作才会“起作用”。因此,在实践中,唯一性最终还是有保证的

大多数标准类型的实例都没有在孤立项中声明,因此在导入标准类型时无法避免导入它们。因此,您只能使用标准实例

有一些Haskell扩展,例如
重叠实例
不连贯性
,它们可以破坏实例的唯一性。我相信大多数哈斯克勒认为这是系统中的疣,而不是积极开发的东西。事实上,当同一类型存在多个实例时,编译器将如何选择就不再清楚了。这使得代码非常脆弱,因此我建议不要试图破坏实例的唯一性