[Template-haskell] Reification in TH

Sean Seefried sseefried at cse.unsw.edu.au
Wed Nov 19 19:07:58 EST 2003


Hi Simon and fellow TH users,

> Have the TH s you mentioned in your communities report now been fixed?

I've played around with reifying types and found that one can only 
reify names that have the following format:

Name occ (NameG th_ns mod)

which means that it's not possible to reify the Name "x" in the 
following expression:

\x -> x + 3

since it is local.  I realise that implementing such reification is a 
whole new can of worms. I'll give you an idea of what I want and then 
you can tell me whether it's infeasible or not.

I might have a block of declarations like this

ds = [d|   f = ....
                g x = f .... x....
          |]


It would be extra nice if I could reify the type of "x" in the 
following code.  Of course the problem is that we don't even know if 
"f" (or "g" for that matter) is going to type check until we've spliced 
it.  So we can only reify "x"'s type at splice time.

I need the ability to reify "x"'s type and then, based on the 
information I get back, transform the block of declarations, "ds", in a 
certain manner.
So I would in effect be doing a kind of "speculative splice".   But a 
splice of top-level declarations can only occur at the top level! What 
I'm suggesting would be a speculative splice inside the body of a 
function, something that will ONLY work when the DecQ that we are 
splicing only contains Names that refer to functions in other modules 
or within the DecQ. (That is, we can't have the functions referring to 
variables outside the DecQ but in the current module!).  Fortunately, 
this condition is satisfied by the DecQs I wish to do reification in.

I can understand why no one would want to write a "reify" function as 
described above.

But the only reason I've been throwing functions in [d| |] brackets is 
because I can't reify entire modules. (We would have to bloat .hi files 
for this to be the case.)  But, say this were possible.  Then it would 
be MUCH easier to code a reify function that could return the types of 
local Names, because we would already known that the module which we 
are reifying type checks and then in the bloated .hi files we could 
simple annotate each occurrence of a Name with its type.  This would be 
extremely useful to me.

Cheers,

Sean



More information about the template-haskell mailing list