Haskell 如何在本地使用不可判定实例?

Haskell 如何在本地使用不可判定实例?,haskell,ghc,typeclass,type-systems,termination,Haskell,Ghc,Typeclass,Type Systems,Termination,是的,我知道,不可判定的实例可能不好。我真的很努力地设计我的模块,这样它就不需要了,但是我有这样的东西: instance Foo x (C x y) => Bar (C x y) where ... 改变它会使API变得更加丑陋。我从不从Bar中导出Foo,因此没有办法进行循环 另一方面,启用不可判定实例会使愚蠢的错误容易被忽略。例如,我可能会错误地写下如下内容: instance Foo x (C x z) => Bar (C x y) where ...

是的,我知道,
不可判定的实例
可能不好。我真的很努力地设计我的模块,这样它就不需要了,但是我有这样的东西:

instance Foo x (C x y) => Bar (C x y) where

    ...
改变它会使API变得更加丑陋。我从不从
Bar
中导出
Foo
,因此没有办法进行循环

另一方面,启用
不可判定实例
会使愚蠢的错误容易被忽略。例如,我可能会错误地写下如下内容:

instance Foo x (C x z) => Bar (C x y) where

    ...
其中,
z
永远不会出现在右侧

问题:是否可以在模块中本地使用
不可判定实例
,即显式标记取消常用终止规则的位置

当然,它不会帮助终止,但它会使使用此扩展的决定更加明智


问题2:是否有比
不可判定实例
更弱的东西仍然不能保证终止,但会禁止像第二个代码片段这样的边界线情况?

到目前为止,语言杂注是每个模块的,所以第一个问题的答案是否定的。至于第二个问题,我不太确定,但我知道除了不可判定的实例之外,没有其他扩展允许该实例

然而,不可判定实例并没有那么糟糕,它只允许类型检查器尝试解析无法证明终止的实例。不过,上下文堆栈阻止它实际上永远循环