[Template-haskell] quasi quotes and Q monad

Simon Peyton-Jones simonpj at microsoft.com
Wed Jan 4 06:55:37 EST 2006


I've read your message, but I can't figure out what problem you are
trying to solve.

Can you give a small example that demonstrates it?

Simon

| -----Original Message-----
| From: template-haskell-bounces at haskell.org
[mailto:template-haskell-bounces at haskell.org] On
| Behalf Of Ch. A. Herrmann
| Sent: 02 January 2006 16:17
| To: template-haskell at haskell.org
| Subject: [Template-haskell] quasi quotes and Q monad
| 
| Dear TH experts,
| 
| I have a problem concerning the interaction of quasi quotes and the
| quotation monad. Assume a code generating function f (... -> Q Exp)
| which is parameterized by a code generating function g (of type
| Exp -> Q Exp, or(?) Q Exp -> Q Exp).
| 
| Expressing the problem in the simplest form, the actual instance for g
| is (\x -> [| h($x) |]), where h is a toplevel Haskell function working
| on arbitrary types, and function f instantiates x
| with an expression which consists just of a single variable (VarE). In
| order to splice x in the code ($x), the type of x must be (Q Exp). The
| reason for that, as mentioned in the 2002 paper
| by Sheard and Peyton Jones "Template Metaprogramming for Haskell", is
| that the computation of x must be able to access the Q monad. The
place
| inside f where the actual name for the variable x is generated, has
| already access to the Q monad and the *result* of g is
| embedded in this monad, no problem. However, I cannot figure out how
| this monad can be passed as an *argument* to g and conceptually, there
| is no justification to pass this monad: it is just an offspring
version
| of the one where the lexical scope of g belongs to.
| 
| The value I want to pass for x is of type Exp. Of course, I could turn
| this type into (Q Exp) by applying return, but this artificial
instance
| of the Q monad would come from nowhere, not being connected with the
| regular instance used, e.g., for the fresh name generation.
| 
| Especially, I have the following questions:
| * Is there a simple solution to this problem? If so, please tell me
and
|    forget about the following questions.
| * Is the quasi quote mechanism at all appropriate for what I want to
do
|    or should one better change to the concrete AST representation?
That
| 
|    would be unfortunate because my aim is to develop Template Haskell
|    examples which demonstrate ease of use.
| * If return is used to turn an expression into monadic form before
|    splicing, is it possible that
|    (a) the consistency of fresh name generation is lost, even if one
|        does the name generation for the spliced expression oneself,
|    (b) something else goes wrong?
| 
| Many thanks in advance and a Happy New Year
| --
| Christoph Herrmann
| 
| 
| 
| _______________________________________________
| template-haskell mailing list
| template-haskell at haskell.org
| http://www.haskell.org/mailman/listinfo/template-haskell


More information about the template-haskell mailing list