【问题标题】: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 扩展,例如 OverlappingInstancesIncoherentInstances 会破坏实例的唯一性。我相信大多数 Haskeller 认为这是系统中的一个缺陷,而不是积极利用的东西。实际上,当同一类型存在多个实例时,编译器将如何选择就不再清楚了。这使得代码非常脆弱,所以我建议不要尝试破坏实例唯一性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-05
      • 2012-06-20
      • 2018-03-08
      • 2012-03-10
      • 2012-11-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多