【问题标题】:Replacing an instance declaration替换实例声明
【发布时间】:2015-05-30 07:54:07
【问题描述】:
我想替换标准类型的 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 替换实例声明?
【问题讨论】:
标签:
class
haskell
instance
【解决方案1】:
Haskell 实例是唯一的:在整个程序中,每种类型应该只有一个实例。
孤立模块可能会暂时破坏唯一性。孤儿是声明类型实例的模块,但不声明类型而不是类。原则上,两个模块可以从第三个模块导入相同的类型并为其声明不同的实例。这个“工作”直到第四个模块尝试从两者导入,导致两个实例之间发生冲突,从而触发编译器错误。因此,在实践中,唯一性最终仍然得到保证。
大多数标准类型的实例都没有在孤儿中声明,因此在导入标准类型时无法避免导入它们。因此,您只能使用标准实例。
有一些 Haskell 扩展,例如 OverlappingInstances 和 IncoherentInstances 会破坏实例的唯一性。我相信大多数 Haskeller 认为这是系统中的一个缺陷,而不是积极利用的东西。实际上,当同一类型存在多个实例时,编译器将如何选择就不再清楚了。这使得代码非常脆弱,所以我建议不要尝试破坏实例唯一性。