我的错误大致如下:
Could not deduce T1 p (T2 p a b) ~ (a, b)
来自函数声明,其中T1
和T2
是类型系列。
但是,所有p
,a
和b
的平等均属实。
我可以通过添加:
来修复它T1 p (T2 p a b) ~ (a, b)
但后来我得到了类似的内容:
Could not deduce T1 p (T2 p a c) ~ (a, c)
最终我可以为函数添加足够的等式约束来消除错误。
另一种方法是不定义函数签名,编译器派生出一些可怕的东西,但它工作正常。
但有没有办法可以说像
forall p a b. T1 p (T2 p a b) ~ (a, b)
所以我可以一次性完成所有这些工作?
答案 0 :(得分:0)
最困难的原因是你的陈述
[所有]
p
,a
和b
的平等均为真。
不太正确。你声称的平等是
T1 p (T2 p a b) ~ (a, b)
假设我给你
type family P :: k
type family A :: k
type family B :: k
其中没有任何家庭有任何实例。 T1 P (T2 P A B)
还会减少到(A, B)
吗?如果是这样,我相信GHC应该接受你的功能,没有上下文。如果没有,你必须传递一些证据。例如,您可以传递证据表明每种类型都是某种形式或不是某种形式。在模式匹配下,也许还有一些额外的帮助,家庭应该减少。