Template Haskell声明中的局部变量

ram*_*ion 7 haskell template-haskell

我正在阅读pozorvlak在Template Haskell上发布的婴儿步骤帖子,试图自己理解它,我发现了这一部分:

回想一下,我们试图以编程方式生成表单的声明data Fred = Fred.让我们用quasiquoting来试试吧.由于调用TH代码的限制,我们必须将它放在自己的模块中,所以让我们将以下内容放在Keyword.h中,以便编译器可以找到它:

module Keyword (keyword) where

import Language.Haskell.TH.Syntax
keyword name = [d| data $(name) = $(name) |]
Run Code Online (Sandbox Code Playgroud)

现在编译:

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

Keyword.hs:6:24: parse error on input `$('
Run Code Online (Sandbox Code Playgroud)

这跟我打了个响铃,看起来和我最近读到的其他东西一样,模板Haskell包文档:

对于动态绑定的thing(NameS),我们可能希望它们以依赖于上下文的方式,因此我们再次不需要名称空间.例如:

let v = mkName "T" in [| data $v = $v |]
Run Code Online (Sandbox Code Playgroud)

这里我们Name对类型构造函数和数据构造函数使用相同的

嗯,这几乎是一样的,让我们看看我能不能这样做:

 module Example where
 import Language.Haskell.TH
 let v = mkName "T" in [| data $v = $v |]
Run Code Online (Sandbox Code Playgroud)

给它一个旋转:

 % ghc -XTemplateHaskell -c Example.hs

 Example.hs:3:25: parse error on input `data'
Run Code Online (Sandbox Code Playgroud)

嗯......哦,也许我需要使用d申报报价?

 let v = mkName "T" in [d| data $v = $v |]
Run Code Online (Sandbox Code Playgroud)

现在:

 Example.hs:3:31: parse error on input `$v'
Run Code Online (Sandbox Code Playgroud)

发生什么了?使用显式拼接不会更改任何错误.我是否将模板Haskell文档脱离了上下文,或者它只是错误的?

ram*_*ion 5

看起来这是 GHC 版本早于 6.12 的错误,您无法拼接 types。此错误已在 GHC 7.10.1 版中修复