【问题标题】:How to use UndecidableInstances locally?如何在本地使用 UndecidableInstances?
【发布时间】:2012-02-14 02:27:52
【问题描述】:

是的,我知道UndecidableInstances 可能很糟糕。我真的很努力地设计我的模块,以便它不需要它但是我有这样的东西:

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

    ...

更改它会使 API 变得更加丑陋。我从来没有从Bar 中派生出Foo,所以没有办法进行循环。

另一方面,启用UndecidableInstances 会使愚蠢的错误容易被忽视。例如,我可能会误写如下内容:

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

    ...

z 永远不会出现在右侧。

问题:是否可以在模块中本地使用UndecidableInstances,即明确标记解除通常终止规则的位置?

当然,这对终止没有帮助,但它会使使用此扩展程序的决定更加明智。

问题 2: 有没有比UndecidableInstances 更弱的东西仍然不能保证终止,但会禁止一些像第二个代码 sn-p 这样的边界线情况?

【问题讨论】:

    标签: haskell ghc typeclass type-systems termination


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-02
      • 1970-01-01
      • 2021-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-02
      相关资源
      最近更新 更多