如何在本地使用UndecidableInstances?

时间:2012-02-14 02:27:53

标签: haskell ghc typeclass type-systems termination

是的,我知道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的东西仍然无法保证终止,但会禁止更多边界线情况,例如第二个代码段吗?

1 个答案:

答案 0 :(得分:4)

到目前为止,语言编译指示是按模块进行的,因此第一个问题的答案是否定的。至于第二个问题,我不太确定,但我知道除了UndecidableInstances之外没有任何其他扩展允许该实例。

但是,UndecidableInstances并不是那么糟糕,它只是允许类型检查器尝试解析无法证明终止的实例。但是,上下文堆栈阻止它实际上永远循环。