Ticket #6062 (new bug)
TH treats non-functions in function position inconsistently
| Reported by: | heisenbug | Owned by: | simonpj |
|---|---|---|---|
| Priority: | normal | Milestone: | 7.8.1 |
| Component: | Compiler | Version: | 7.5 |
| Keywords: | Cc: | ||
| Operating System: | Unknown/Multiple | Architecture: | Unknown/Multiple |
| Type of failure: | None/Unknown | Difficulty: | Unknown |
| Test Case: | Blocked By: | ||
| Blocking: | Related Tickets: |
Description
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.
