替换实例声明

时间:2015-05-29 23:35:20

标签: 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 -- Defined in `GHC.Show'

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

1 个答案:

答案 0 :(得分:4)

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

Orphan模块可以暂时打破唯一性。孤儿是声明类型实例的模块,但不声明类型而不是类。原则上,两个模块可以从第三个模块导入相同的类型,并为其声明不同的实例。这“工作”,直到第四个模块尝试从两者导入,导致两个实例之间发生冲突,从而触发编译器错误。因此,在实践中,唯一性仍然最终得到保证。

标准类型的大多数实例未在孤立中声明,因此在导入标准类型时无法避免导入它们。因此,您仍然坚持使用标准实例。

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