[Template-haskell] quasi quotes and Q monad
simonpj at microsoft.com
Fri Apr 14 08:09:03 EDT 2006
You have probably forgotten all about this, but it's been in my mailbox
Anyway, since today is a peaceful day, I have taken a look. Sorry for
the long delay. I attach the same file you attached, to give the
The short answer is: yes, the two versions of f do the same thing. I
still can't figure out why you are worried. You say "Somehow I felt the
need to connect the argument of g with the monad of which the value of
g's result belongs to", but I'm not sure what you mean. Nor did I
understand your last paragraph.
In any case, is there a problem here? The quasi-quoted version of f
works just fine.
| -----Original Message-----
| From: Ch. A. Herrmann [mailto:herrmann at infosun.fmi.uni-passau.de]
| Sent: 04 January 2006 14:45
| To: Simon Peyton-Jones
| Cc: template-haskell at haskell.org
| Subject: Re: [Template-haskell] quasi quotes and Q monad
| Hi Simon,
| I have reduced the program to the parts interesting for
| our topic. The program is attached.
| Function f looks nice with the quasi quotation, but in case
| we have to use the low-level style the argument to
| g must be a monadic value, which I did here by using
| return, e.g. (return (VarE x)).
| I worried whether the function f in low-level style with this
| use of return is equivalent to the quasi-quoted version.
| Somehow I felt the need to connect the argument of g with
| the monad of which the value of g's result belongs to. It
| appeared to me that this is what the quotation brackets [|y|] are
| establishing, because y is also in the scope of the outer brackets.
| On the one hand, I wonder why the name generation history, when
| code generation for a quotation part is finished, is not reset to the
| before. This would be the case with the separate monad for g's
| argument. On the other hand, it must be possible to nest quotation
| brackets and still establish that names at the different levels are
| distinct, if it is wanted.
| Many thanks in advance for any enlighting explanation
| Simon Peyton-Jones wrote:
| >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?
| >| -----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
| >| is (\x -> [| h($x) |]), where h is a toplevel Haskell function
| >| on arbitrary types, and function f instantiates x
| >| with an expression which consists just of a single variable (VarE).
| >| order to splice x in the code ($x), the type of x must be (Q Exp).
| >| reason for that, as mentioned in the 2002 paper
| >| by Sheard and Peyton Jones "Template Metaprogramming for Haskell",
| >| that the computation of x must be able to access the Q monad. The
| >| 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
| >| this monad can be passed as an *argument* to g and conceptually,
| >| is no justification to pass this monad: it is just an offspring
| >| 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
| >| this type into (Q Exp) by applying return, but this artificial
| >| of the Q monad would come from nowhere, not being connected with
| >| 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
| >| forget about the following questions.
| >| * Is the quasi quote mechanism at all appropriate for what I want
| >| or should one better change to the concrete AST representation?
| >| would be unfortunate because my aim is to develop Template
| >| 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
| >| 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
-------------- next part --------------
A non-text attachment was scrubbed...
Size: 1014 bytes
Url : http://www.haskell.org//pipermail/template-haskell/attachments/20060414/561f26e8/Gen.obj
More information about the template-haskell