断言类型家庭平等

时间:2016-07-31 12:55:06

标签: haskell type-families

我的错误大致如下:

Could not deduce T1 p (T2 p a b) ~ (a, b)

来自函数声明,其中T1T2是类型系列。

但是,所有pab的平等均属实。

我可以通过添加:

来修复它
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)

所以我可以一次性完成所有这些工作?

1 个答案:

答案 0 :(得分:0)

最困难的原因是你的陈述

  

[所有] pab的平等均为真。

不太正确。你声称的平等是

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应该接受你的功能,没有上下文。如果没有,你必须传递一些证据。例如,您可以传递证据表明每种类型都是某种形式或不是某种形式。在模式匹配下,也许还有一些额外的帮助,家庭应该减少。