
Hello Haskell world. One well-known missfeature of TemplateHaskell is it's «untypedness». I mean, that if you have say an expression (Exp or Q Exp), you do not know it's type (does it represent String or Int or whatever). And GHC does not know too. So, one could easily construct bad-typed expressions using TH, and GHC will complain only on generated code, not on TH code. Such a missfeature was a reasoned decision, because adding some typing into TH will add much complexity to compiler and to language. As far as can I see, using features of last GHC one could write typed TH library relatively easily, and saving backwards compatibility. For example, now we have Q monad and Exp type in "template-haskell" package. Let's imagine some new package, say "typed-template-haskell", with new TQ monad and new polymorphic type Exp :: * -> *. Using last GHC's features, one will easily write something like "expr :: Exp String", which will mean that "expr" represents a string expression. And we will need a new function, say runTQ :: TQ a -> Q a (or some more complicated type), which will turn TypedTemplateHaskell's constructs into plain TH. One question will be on quotations and antiquotations: they are implemented to work untyped TH constructs, how to implement compatibility with new typed TH? We could add some support of them to GHC... Or, maybe define a phantom type (say, Any), and some conversion functions, say untyped :: Language.Haskell.TH.Syntax.Exp -> Language.Haskell.TH.Typed.Syntax.Exp Any. Main idea is: seems new GHC enables us to implement "typed TH" without modifying GHC itself, only by writing a library. Is it so? Any further thoughts? With best regards, Ilya Portnov.