TH treats non-functions in function position inconsistently
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.
Trac metadata
Trac field | Value |
---|---|
Version | 7.5 |
Type | Bug |
TypeOfFailure | OtherFailure |
Priority | normal |
Resolution | Unresolved |
Component | Compiler |
Test case | |
Differential revisions | |
BlockedBy | |
Related | |
Blocking | |
CC | |
Operating system | |
Architecture |