2011-04-19 62 views
7

我通过pozorvlak's baby steps post on Template Haskell读试图了解它自己,我碰到这个节来了:我们试图以编程方式产生形式data Fred = Fred的声明局部变量报关单

召回。让我们尝试quasiquoting。因为调用TH代码的限制,我们必须把它放在自己的模块中,所以让我们把在Keyword.hs下面这样编译器可以找到它:

module Keyword (keyword) where 

import Language.Haskell.TH.Syntax 
keyword name = [d| data $(name) = $(name) |] 

现在编译:

Prelude> :l Keyword.hs 
[1 of 1] Compiling Keyword   (Keyword.hs, interpreted) 

Keyword.hs:6:24: parse error on input `$(' 

这响钟我,似乎类似于其他的东西我最近读了,the Template Haskell package documentation

对于动态绑定的东西(NameS)我们可能希望它们以一种与上下文相关的方式,所以我们不再需要名称空间。例如:

let v = mkName "T" in [| data $v = $v |] 

在这里我们使用两种类型的构造函数和数据构造

那么同样Name,这几乎是相同的,让我们来看看,如果我能得到那个工作:

module Example where 
import Language.Haskell.TH 
let v = mkName "T" in [| data $v = $v |] 

试一试:

% ghc -XTemplateHaskell -c Example.hs 

Example.hs:3:25: parse error on input `data' 

嗯...哦,也许我需要使用d进行报价引用?

let v = mkName "T" in [d| data $v = $v |] 

现在:

Example.hs:3:31: parse error on input `$v' 

所以....这是怎么回事?使用显式拼接不会更改任何错误。我是否将模板Haskell文档置于上下文之外,还是仅仅是错误的?

+1

你用-XQuasiQuotes试过了吗? – hammar 2011-04-19 21:17:03

+0

@hammar:同样的错误。 – rampion 2011-04-19 21:20:21

回答