模板Haskell声明中的局部变量

我正在阅读模板哈斯克尔的pozorvlak的婴儿步骤帖子,试图自己理解它,并且我遇到了这个部分:

回想一下,我们试图以编程方式生成表单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 `$('

这与我一起敲响了钟声,似乎与我最近阅读的其他内容相似,即模板Haskell包文档:

对于动态绑定的事物( 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文档置于上下文之外,还是仅仅是错误的?


看起来这是一个GHC版本高于6.12的版本,无法在类型中拼接。

链接地址: http://www.djcxy.com/p/52079.html

上一篇: Local variables in Template Haskell declarations

下一篇: Calling a New View when selecting a Row in a 'UITableView'