Haskell 断言所有等式的类型族

Haskell 断言所有等式的类型族,haskell,type-families,Haskell,Type Families,我得到的错误大致如下: 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) 最终,我可以向函数添加足够的相等约束来消除错误 另一种选择是不定义函数签名,编译器派生出一些可怕的东西,但

我得到的错误大致如下:

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)

所以我可以一次就把这些都讲完吗?

最有可能造成你困难的原因是你的陈述

对于所有的
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应该接受你的职能,没有任何背景。如果没有,你就必须提供一些证据。例如,您可以传递每种类型是否具有某种形式的证据。在模式匹配下,或者在一些额外的帮助下,家庭应该减少。

顺便说一句,T1和T2是什么?请添加一个完整的示例,说明您正在尝试做什么。这个问题目前还不能回答,“遵循平等是正确的”——你怎么知道这是正确的?问题是要向GHC证明它是这样的,以便您可以在类型签名中省略类型相等约束吗?