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.

_______________________________________________
Haskell-Cafe mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to