是的,我知道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/

10-11 03:39