[GHC] #8031: Template Haskell gets confused with kind variables introduced in separate foralls

GHC ghc-devs at haskell.org
Wed Jul 3 00:37:01 CEST 2013


#8031: Template Haskell gets confused with kind variables introduced in separate
foralls
-----------------------------+----------------------------------------------
Reporter:  goldfire          |          Owner:                           
    Type:  bug               |         Status:  new                      
Priority:  normal            |      Component:  Compiler                 
 Version:  7.7               |       Keywords:  TemplateHaskell PolyKinds
      Os:  Unknown/Multiple  |   Architecture:  Unknown/Multiple         
 Failure:  None/Unknown      |      Blockedby:                           
Blocking:                    |        Related:                           
-----------------------------+----------------------------------------------
 The following file compiles without complaint:

 {{{
 {-# LANGUAGE TemplateHaskell, RankNTypes, PolyKinds, DataKinds,
 TypeOperators,
              GADTs #-}

 module S2 where

 import Language.Haskell.TH

 data Proxy a = Proxy

 data SList :: [k] -> * where
   SCons :: Proxy h -> Proxy t -> SList (h ': t)

 dec :: Q [Dec]
 dec = [d| foo :: forall (a :: k). Proxy a -> forall (b :: [k]). Proxy b ->
 SList (a ': b)
           foo a b = SCons a b |]

 foo' :: forall (a :: k). Proxy a -> forall (b :: [k]). Proxy b -> SList (a
 ': b)
 foo' a b = SCons a b
 }}}

 Note that `foo` and `foo'` are identical, just at different compilation
 stages. However, the following module does not compile:

 {{{
 {-# LANGUAGE TemplateHaskell, DataKinds, PolyKinds, RankNTypes #-}

 module S3 where

 import S2

 $(dec)
 }}}

 The error is
 {{{
 S3.hs:7:3:
     Couldn't match kind ‛k’ with ‛k1’
       ‛k’ is a rigid type variable bound by
           the type signature for
             foo :: Proxy k a0
                    -> forall (k1 :: BOX) (b0 :: [k1]).
                       Proxy [k1] b0 -> SList k1 ((':) k1 a0 b0)
           at S3.hs:7:3
       ‛k1’ is a rigid type variable bound by
            the type signature for
              foo :: Proxy k a0 -> Proxy [k1] b -> SList k1 ((':) k1 a0 b)
            at S3.hs:7:3
     Expected type: SList k1 ((':) k1 a0 b)
       Actual type: SList k ((':) k a0 b)
     Relevant bindings include
       foo :: Proxy k a0
              -> forall (k1 :: BOX) (b0 :: [k1]).
                 Proxy [k1] b0 -> SList k1 ((':) k1 a0 b0)
         (bound at S3.hs:7:3)
       a_aTCB :: Proxy k a0 (bound at S3.hs:7:3)
       b_aTCC :: Proxy [k1] b (bound at S3.hs:7:3)
     In the expression: SCons a_aTCB b_aTCC
     In an equation for ‛foo’: foo a_aTCB b_aTCC = SCons a_aTCB b_aTCC
 }}}

 If I change the nested `forall`s in the definition of `foo` to be just one
 top-level `forall`, the problem goes away.

 This may seem terribly esoteric, but it's easier to generate nested
 `forall`s than to float them all to the top-level after processing a type.
 I received an email requesting that I get the `singletons` library to
 compile with HEAD, and this seems to be why it doesn't.

 This is a regression error: the code compiles fine with 7.6.3 but not with
 HEAD.

-- 
Ticket URL: <http://hackage.haskell.org/trac/ghc/ticket/8031>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler



More information about the ghc-tickets mailing list