Given an expression foo, I could declare a top-level function
bar = foo
and get the type of foo as Type by reifying bar:
case reify 'bar of
VarI _ t _ _ -> t
Is there a direct way of getting the type of foo, without creating the redundant definition of bar? Ideally as function of type Exp -> Q Type.
You're asking for a function of a type like
Exp -> Q InfoorExp -> Q Type, yes? TH doesn't provide such a function. The only TH function that produces anInfoisreify, and no other TH type seems to expose the type information you're after. It appears that the current TH API does not provide a way to reify arbitrary expressions.I'm not an expert in GHC's internals, but poking around in
compiler/typecheck/TcSplice.hsseems to confirm thatreifyworks by looking up an already-compiled (and typechecked) entity and converting the compiler's existing knowledge of its type etc. into TH'sInfotype. That information wouldn't exist for an arbitraryExp. I imagine we'd have to plumb the expression back through another compiler pass.