围绕最近的一些问题,我想我会把焦点转向老妖怪,OverlappingInstances
.
几年前我可能一直在认真地问这个问题:毕竟,您可以提供有用的默认实例,而其他人可以在需要时用更具体的实例覆盖它们,这有什么不好呢?
一路走来,我对OverlappingInstances
确实不那么干净,最好避免的观点产生了一些欣赏;主要是因为它在理论上的基础不是很好,不像其他大的扩展。
但仔细想想,如果有人问我,我不确定我是否可以向另一个人解释它到底有什么不好。
我正在寻找的是使用OverlappingInstances
可能导致坏事发生的具体示例,无论是通过颠覆类型系统或其他不变量,还是只是一般的意外或混乱。
我知道的一个特殊问题是它破坏了仅添加或删除单个模块导入不能改变程序含义的属性,因为随着扩展的打开,可以静默添加或删除新的实例重叠。虽然我可以理解为什么这令人不快,但我不明白为什么它会如此可怕。
额外的问题:只要我们讨论的是有用但理论上没有充分基础的扩展,这些扩展可能会导致糟糕的事情发生,为什么GeneralizedNewtypeDeriving
没有得到同样糟糕的说唱?是不是因为负面的可能性更容易定位?更容易看出什么会导致问题并说“不要那样做”?
(注意:如果答案的首当其冲集中在 上,我更愿意OverlappingInstances
,而不是IncoherentInstances
需要较少的解释。)
编辑:这里也有类似问题的好答案。