[Haskell-cafe] Differences between QuasiQuotes and TemplateHaskell

Richard Eisenberg eir at cis.upenn.edu
Mon Apr 11 14:15:25 UTC 2016


Counterintuitively, quasiquotes are like TH *splices* not TH *quotes*. This is true despite the fact that the quasiquote syntax looks just like a quote. And they're quasi*quotes*. But they really should be quasi*splices*. Specifically,

> [blah|...|]

is the same as

> $(selector blah "...")

where `selector` is the appropriate record selector based on the context where the quasiquote appears.

You are not the first to fall into this trap! Though, I believe this is well documented in the manual.

Richard

On Apr 11, 2016, at 9:59 AM, Dominik Bollmann <dominikbollmann at gmail.com> wrote:

> 
> Hi,
> 
> Originally, I thought that QuasiQuotes build on top of TemplateHaskell,
> since they just provide a way of parsing a string into a Template
> Haskell AST. That is, a quasi-quoter is defined by four parsers of types
> 
> String -> Q Exp
> String -> Q Pat
> String -> Q Type
> String -> Q Dec
> 
> that parse EDSLs into corresponding Haskell (abstract) syntax.
> 
> However, while playing around with the Shakespeare package's quasiquoter
> hamlet, I noticed that (e.g.) a snippet
> 
> html = [hamlet|
>  <html>
>    <body>
>      <h1>Hello World
> |] ()
> 
> has type Html and not (as I would expect) Q Exp. Hence, it seems as if
> quasiquotes are spliced in implicitly?
> 
> This confuses me since in Template Haskell in general a quote (e.g.,)
> [e| \x -> x |] has type Q Exp, which then needs to be explicitly spliced
> in order to produce the id function \x -> x.
> 
> So why do quasiquotes not have types Q Exp, but rather concrete types?
> 
> If anyone could clarify my confusion, this would be great!
> 
> Dominik.
> 
> _______________________________________________
> Haskell-Cafe mailing list
> Haskell-Cafe at haskell.org
> http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe



More information about the Haskell-Cafe mailing list