Haskell Inaccessible code bug?

北战南征 提交于 2020-02-03 05:05:06

问题


Say I have the following (erroneous) code.

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 will then give me this error:

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

Isn't this error message completely wrong? The error has nothing to do with AApply.


回答1:


Isn't this error message completely wrong? The error has nothing to do with AApply.

Not completely. It's arguably a bug that you get that error message, but it's not completely off base.

Look at the whole thing together after looking at the pieces.

test (APure) a = a

says we have a function

test :: A a b -> r -> r

Put that together with the signature

test :: (A a b) -> a -> b

and unify, ignoring the type error from the first equation, the type is refined to

test :: A r r -> r -> r

Then look at the equation

test AApply a = undefined

and see how that is inaccessible under the refined type, since

AApply :: A (A b c) c

would entail

c ~ A b c

if AApply were a valid first argument.



来源:https://stackoverflow.com/questions/16134836/haskell-inaccessible-code-bug

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!