variable escaping in existential type error on 6.8 but not 6.10
I wrote a patch for darcs that does the following:
'l' -> do let selected = case get_choices pc of
(first_chs:>_:>last_chs) ->
if whichch == Last || whichch == FirstReversed
then last_chs else first_chs
putStrLn $ "---- Already selected "++things++" ----"
mapM_ putDocLn $ mapFL (\a ->
showPatch `unseal2` (seal2 $ tp_patch a)) selected
where
get_choices :: Patchy p => PatchChoices p C(x y) -> (FL (TaggedPatch p) :> FL (TaggedPatch p) :> FL (TaggedPatch p)) C(x y)
data (a1 :> a2) C(x y) = FORALL(z) (a1 C(x z)) :> (a2 C(z y))
data FL a C(x z) where
(:>:) :: a C(x y) -> FL a C(y z) -> FL a C(x z)
NilFL :: FL a C(x x)
This gives an error with ghc-6.8.2 on Mac OS X (others have reported errors with 6.8.3 as well):
Inferred type is less polymorphic than expected
Quantified type variable `z2' escapes
When checking an existential match that binds
first_chs :: FL (TaggedPatch p) x z1
last_chs :: FL (TaggedPatch p) z2 z
The pattern(s) have type(s): (:>)
(FL (TaggedPatch p))
(FL (TaggedPatch p) :> FL (TaggedPatch p))
x
z
The body has type: FL (TaggedPatch p) z2 z
In a case alternative:
(first_chs :> _ :> last_chs)
-> if whichch == Last || whichch == FirstReversed then
last_chs
else
first_chs
In the expression:
case get_choices pc of
(first_chs :> _ :> last_chs)
-> if whichch == Last || whichch == FirstReversed then
last_chs
else
first_chs
I have been convinced that this is indeed a programming error by the fine people on #ghc. So the remaining question is: Why does it work on ghc-6.10.1?
I will try if I can construct a simpler test case.
Thanks,
Christian
Trac metadata
| Trac field | Value |
|---|---|
| Version | 6.10.1 |
| Type | Bug |
| TypeOfFailure | OtherFailure |
| Priority | normal |
| Resolution | Unresolved |
| Component | Compiler |
| Test case | |
| Differential revisions | |
| BlockedBy | |
| Related | |
| Blocking | |
| CC | |
| Operating system | |
| Architecture |