我正在阅读pozorvlak 在 Template Haskell 上的婴儿步骤帖子,试图自己理解它,我遇到了这个部分:
回想一下,我们试图以编程方式生成表单的声明
data Fred = Fred
。让我们尝试使用准引用。由于调用 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'
发生什么了?使用显式拼接不会改变任何一个错误。我是在断章取义地使用 Template Haskell 文档,还是只是错了?