Haskell无法访问代码错误?

时间:2013-04-21 18:42:37

标签: haskell compiler-errors gadt

说我有以下(错误的)代码。

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无关。

1 个答案:

答案 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是有效的第一个参数。