是的,我知道这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
...
wherez
永远不会出现在右侧。
问题:是否可以UndecidableInstances
在模块中本地使用,即明确标记解除通常终止规则的地方?
当然,它对终止没有帮助,但它会使使用此扩展的决定更加明智。
问题2:是否有比这更弱的东西UndecidableInstances
仍然不能保证终止,但会禁止一些像第二个代码片段这样的边界线情况?