Skip to content

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
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information