我知道-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?
我是不是该...
- 只需启用扩展即可?有人可以详细说明它会给我带来什么样的麻烦吗?
- 添加另一个参数
Foo
,这样最后一个实例声明就变成了类似的东西Foo c d (Bar a d)
?这样做的一个问题是我可能还有其他实例Foo
永远不会引用任何此类“第四类型参数”(即存在以下形式的实例instance Foo A B
在我的代码的不相关部分),所以这些会破坏。我宁愿修复我的实例,而不是我的类。
- 创建一个新类
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(使用前将#替换为@)