TH treats non-functions in function position inconsistently
I start GHCi like this:
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...
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.