是的,我知道UndecidableInstances
可能不好。我真的很努力地设计模块,以使其不需要它,但是我有这样的东西:
instance Foo x (C x y) => Bar (C x y) where
...
并对其进行更改会使API更加难看。我从不从
Foo
派生Bar
,所以没有办法进行循环。另一方面,启用
UndecidableInstances
可以使愚蠢的错误易于忽略。例如,我可能会错误地写类似:instance Foo x (C x z) => Bar (C x y) where
...
z
永远不会出现在右侧。问题:是否可以在模块中本地使用
UndecidableInstances
,即明确标记取消常规终止规则的位置?当然,它对终止没有帮助,但会使使用此扩展名的决定更加明智。
问题2:是否有比
UndecidableInstances
弱的东西仍然不能保证终止,但是会禁止出现更多的边界情况,例如第二个代码片段? 最佳答案
到目前为止,语言编译指示是按模块进行的,因此第一个问题的答案是否定的。至于第二个问题,我不太确定,但是除了UndecidableInstances之外,我没有其他允许该实例的扩展。
但是,UndecidableInstances还不错,它只是允许类型检查器尝试解析无法证明终止的实例。但是,上下文堆栈阻止了它永远永远地循环。
关于haskell - 如何在本地使用UndecidableInstances?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9270899/