【发布时间】:2014-11-12 10:47:14
【问题描述】:
我明白,当有
instance (Foo a) => Bar a
instance (Xyy a) => Bar a
GHC 不考虑上下文,实例被报告为重复。
什么是违反直觉的,(我猜)在选择一个实例之后,它仍然需要检查上下文是否匹配,如果不匹配,则丢弃该实例。那么为什么不颠倒顺序,丢弃上下文不匹配的实例,然后继续处理剩余的集合。
这会以某种方式难以处理吗?我看到它会如何提前导致更多的约束解析工作,但是就像有 UndecidableInstances / IncoherentInstances 一样,当“我知道我在做什么”时,难道不能有 ConsiderInstanceContexts 吗?
【问题讨论】:
-
如果
a是Foo和Xyy,GHC 应该选择哪个实例? -
@mb14:任意。 (
IncoherentInstances已经做了类似的事情,我可以忍受)。 -
确实,唯一的区别似乎是
IncoherentInstances允许 GHC 提交到任一实例,可能会丢弃具有可满足上下文的实例并提交到不可满足的实例(这将触发错误)。如果我理解正确,这个问题会问为什么 GHC 没有BacktrackOnContextFailures标志,以便最终尝试正确的实例。在最坏的情况下,它肯定会导致难以处理,但我们已经有了UndecidableInstances,它会显着影响性能。