Opened 5 years ago

Closed 4 years ago

#6062 closed bug (fixed)

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 Test Case: th/T6062
Blocked By: Blocking:
Related Tickets: Differential Rev(s):
Wiki Page:


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 |]
    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.

Change History (4)

comment:1 Changed 5 years ago by simonpj

difficulty: Unknown

Read: which tackles precisely the question you raise.

I guess you are another customer for this work, which is (still) pending.


comment:2 Changed 5 years ago by igloo

Milestone: 7.8.1
Owner: set to simonpj

comment:3 Changed 4 years ago by Krzysztof Gogolewski <krz.gogolewski@…>

In e595c81ee0951f17d34b918123dfa7711710fe89/testsuite:

Add tests for new TH #4124, #4128, #4170, #4364, #6062

comment:4 Changed 4 years ago by monoidal

Resolution: fixed
Status: newclosed
Test Case: th/T6062

This is now fixed thanks to new TH. Woo hoo!

Note: See TracTickets for help on using tickets.