替换实例声明

Replacing an instance declaration

我想替换 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 实例是唯一的:在整个程序中,每种类型应该只有一个实例。

孤立模块可以暂时破坏唯一性。孤儿是声明类型实例的模块,但不声明类型不是 class。原则上,两个模块可以从第三个模块导入相同的类型并为其声明不同的实例。这 "works" 直到第四个模块尝试从两者导入,导致两个实例之间发生冲突,从而触发编译器错误。所以,在实践中,最终还是保证了唯一性。

标准类型的大多数实例都没有在孤儿中声明,因此在导入标准类型时不可避免地要导入它们。因此,您只能使用标准实例。

有一些 Haskell 扩展,例如 OverlappingInstancesIncoherentInstances 可以破坏实例的唯一性。我相信大多数 Haskell 用户认为这是系统中的一个缺陷,而不是可以积极利用的东西。事实上,当同一类型存在多个实例时,编译器将如何选择就不再清楚了。这使得代码非常脆弱,所以我建议不要尝试破坏实例的唯一性。