说我有以下(错误的)代码。
data A a b where
APure :: (A a b)
AApply :: A (A b c) c
test :: (A a b) -> a -> b
test (APure) a = a
test AApply a = undefined
然后GHC会给我这个错误:
Couldn't match type `b' with `A b1 b'
`b' is a rigid type variable bound by
the type signature for test :: A a b -> a -> b
Inaccessible code in
a pattern with constructor
AApply :: forall c b. A (A b c) c,
in an equation for `test'
In the pattern: AApply
In an equation for `test': test AApply a = undefined
此错误消息是否完全错误? 该错误与AApply无关。
答案 0 :(得分:4)
此错误消息是否完全错误?该错误与
AApply
无关。
不完全。可以说这是一个错误,你得到了这个错误信息,但它并不完全偏离基础。
看完这些碎片后,一起看看整件事。
test (APure) a = a
说我们有一个功能
test :: A a b -> r -> r
将其与签名放在一起
test :: (A a b) -> a -> b
并统一,忽略第一个等式中的类型错误,将类型细化为
test :: A r r -> r -> r
然后看等式
test AApply a = undefined
并查看在精炼类型下如何无法访问,因为
AApply :: A (A b c) c
需要
c ~ A b c
如果AApply
是有效的第一个参数。