[GHC] #6062: TH treats non-functions in function position inconsistently

GHC cvs-ghc at haskell.org
Mon Apr 30 16:39:58 CEST 2012


#6062: TH treats non-functions in function position inconsistently
------------------------------+---------------------------------------------
 Reporter:  heisenbug         |          Owner:                  
     Type:  bug               |         Status:  new             
 Priority:  normal            |      Component:  Compiler        
  Version:  7.5               |       Keywords:                  
       Os:  Unknown/Multiple  |   Architecture:  Unknown/Multiple
  Failure:  None/Unknown      |       Testcase:                  
Blockedby:                    |       Blocking:                  
  Related:                    |  
------------------------------+---------------------------------------------
 I start GHCi like this:
 {{{
 ~/bin/ghci -XTemplateHaskell
 }}}

 My aim is to use TH to rewrite certain application-looking (syntactically)
 constructs to semantically valid haskell code, that passes the type-
 checker (c.f. Conor McBride's "idiom brackets").

 But I already fail at very simple things, because GHC seems to type-check
 the TH quotation's innards...

 This works:
 {{{
 Prelude> :t [| id id |]
 [| id id |]
   :: Language.Haskell.TH.Syntax.Q Language.Haskell.TH.Syntax.Exp
 }}}

 This is also accepted, though it is clearly not typeable:
 {{{
 Prelude> :t [| 1 1 |]
 [| 1 1 |]
   :: Language.Haskell.TH.Syntax.Q Language.Haskell.TH.Syntax.Exp
 }}}

 Encouraged by this I try:
 {{{
 Prelude> :t [| False True |]
 <interactive>:1:4:
     Couldn't match expected type `Bool -> t0' with actual type `Bool'
     The function `False' is applied to one argument,
     but its type `Bool' has none
     In the Template Haskell quotation [| False True |]
     In the expression: [| False True |]
 }}}

 Bummer! Somehow the type-checker does get into business with "expressions"
 inside quotations.

 I believe this is a bug, and a quotation should be built for {{{[| False
 True |]}}} in spite of {{{False True}}} not being typeable.

 I know that using quasi-quotations I can build my own parser and rewrite
 engine around this, but that is a tad heavyweight for me and I'd like to
 understand the root of the above inconsistency and why the type checker
 gets active in some cases above, but not in others.

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



More information about the Glasgow-haskell-bugs mailing list