在这个简单的示例中,您可以看到当从表达式引用转换为AST时,它如何将类型和值构造函数从A
重命名为A_0
和A_1
:
Prelude Language.Haskell.TH> runQ [d|data A = A|]
[DataD [] A_0 [] [NormalC A_1 []] []]
如何强制名称保持我指定的方式?
答案 0 :(得分:1)
名称修改类似于在Lisp世界中调用的“卫生宏”功能,其中宏发出的代码中使用的名称被破坏,因此它们不会干扰宏中代码中的相同命名符号被使用了。
模板haskell语法基本上是生成TH包中定义的普通数据类型的快捷方式。在您的示例中,您可以使用这样的内容来获得所需的名称:
runQ (return $ [DataD [] (mkName "A") [] [NormalC (mkName "A") []] []])
但是请记住,如果使用此宏的代码已经有一个名为A的数据减速,这会导致名称冲突。