我想替换标准类型的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替换实例声明?
答案 0 :(得分:4)
Haskell实例应该是唯一的:在整个程序中每个类型应该只有一个实例。
Orphan模块可以暂时打破唯一性。孤儿是声明类型实例的模块,但不声明类型而不是类。原则上,两个模块可以从第三个模块导入相同的类型,并为其声明不同的实例。这“工作”,直到第四个模块尝试从两者导入,导致两个实例之间发生冲突,从而触发编译器错误。因此,在实践中,唯一性仍然最终得到保证。
标准类型的大多数实例未在孤立中声明,因此在导入标准类型时无法避免导入它们。因此,您仍然坚持使用标准实例。
有一些Haskell扩展名,例如OverlappingInstances
和IncoherentInstances
,可以破坏实例的唯一性。我相信大多数Haskellers认为这是系统中的疣,而不是积极利用的东西。实际上,当同一类型存在多个实例时,不再清楚编译器将如何选择。这使代码非常脆弱,所以我建议不要试图破坏实例唯一性。