UndecidableInstances 什么时候安全?有关 GHC 扩展的一些常见问题

2024-03-27

我知道-XUndecidableInstances 的文档 http://www.haskell.org/ghc/docs/latest/html/users_guide/type-class-extensions.html#undecidable-instances,但我想我应该要求详细说明。

假设我有两个多参数类型类(允许-XMultiParamTypeClasses http://www.haskell.org/ghc/docs/latest/html/users_guide/type-class-extensions.html#id3172593)

class Foo a b
class Goo a b

现在,假设我有一个参数化数据类型

data Bar a b

我想举个例子Foo当它的参数之一是实例的一部分时Goo。我不确定前一句使用了确切的术语,所以这就是我想写的:

instance (Goo c d) => Foo d (Bar a d)

没有的话我不被允许UndecidableInstances扩大。我的想法是否正确,这是因为该实例没有引用c type?

我是不是该...

  1. 只需启用扩展即可?有人可以详细说明它会给我带来什么样的麻烦吗?
  2. 添加另一个参数Foo,这样最后一个实例声明就变成了类似的东西Foo c d (Bar a d)?这样做的一个问题是我可能还有其他实例Foo永远不会引用任何此类“第四类型参数”(即存在以下形式的实例instance Foo A B在我的代码的不相关部分),所以这些会破坏。我宁愿修复我的实例,而不是我的类。
  3. 创建一个新类FooGoo有足够的参数吗?在这种情况下,我会觉得我在重复自己,但至少我不会破坏不相关的课程。

有没有人有什么至理名言?


我是否正确地认为这是因为实例不引用 c 类型?

是的,您的代码不遵守(来自here http://www.haskell.org/ghc/docs/latest/html/users_guide/type-class-extensions.html#instance-rules):

对于上下文中的每个断言:否 类型变量出现的次数较多 断言比头脑中的断言

一般来说,除非您添加其他会一起形成循环的实例,否则您应该是安全的。当涉及到时,事情只会变得非常棘手(并且依赖于编译器)OverlappingInstances,当你走的时候,正义邪恶IncoherentInstances.

如果不了解更多关于您想要完成的任务,就很难提供合理的设计建议,但首先要检查的是您是否真的需要将 c 作为 Goo 的参数。你也许可以这样表达你想要完成的事情:

class Goo d where
    bar :: d c -> Int
    baz :: Quux c => d c -> Int
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

UndecidableInstances 什么时候安全?有关 GHC 扩展的一些常见问题 的相关文章

随机推荐