gpt4 book ai didi

haskell - UndecidableInstances 何时安全?关于 GHC 扩展的一些一般性问题

转载 作者:行者123 更新时间:2023-12-03 15:25:47 25 4
gpt4 key购买 nike

我知道the documentation for -XUndecidableInstances ,但我想我会要求详细说明。

假设我有两个多参数类型类(-XMultiParamTypeClasses 允许)

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类型?

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

  • 有没有人有智慧之言?

    最佳答案

    Am I correct in thinking this is because the instance doesn't refer to the c type?



    是的,您的代码不遵守(来自 here ):

    For each assertion in the context: No type variable has more occurrences in the assertion than in the head



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

    如果不了解您要完成的工作,很难给出合理的设计建议,但首先要检查的是您是否真的需要将 c 作为 Goo 的参数。您也许可以像这样表达您想要完成的事情:
    class Goo d where
    bar :: d c -> Int
    baz :: Quux c => d c -> Int

    关于haskell - UndecidableInstances 何时安全?关于 GHC 扩展的一些一般性问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5017189/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com