Haskell 如何避免在表达式引用生成的AST中重命名符号?

Haskell 如何避免在表达式引用生成的AST中重命名符号?,haskell,template-haskell,Haskell,Template Haskell,在这个简单的示例中,您可以看到它如何将类型和值构造函数从A重命名为A_0和A_1,同时将表达式引号转换为AST: 如何强制名称保持我指定的方式?名称损坏类似于Lisp world中所称的“卫生宏”功能,在Lisp world中,宏发出代码中使用的名称被损坏,以便它们不会干扰宏使用代码中的相同命名符号 模板haskell语法基本上是生成TH包中定义的正常数据类型的快捷方式。在您的示例中,您可以使用类似于以下内容的名称: runQ (return $ [DataD [] (mkName "A") [

在这个简单的示例中,您可以看到它如何将类型和值构造函数从
A
重命名为
A_0
A_1
,同时将表达式引号转换为AST:


如何强制名称保持我指定的方式?

名称损坏类似于Lisp world中所称的“卫生宏”功能,在Lisp world中,宏发出代码中使用的名称被损坏,以便它们不会干扰宏使用代码中的相同命名符号

模板haskell语法基本上是生成TH包中定义的正常数据类型的快捷方式。在您的示例中,您可以使用类似于以下内容的名称:

runQ (return $ [DataD [] (mkName "A") [] [NormalC (mkName "A") []] []])

但是请记住,如果使用此宏的代码已经出现了一种称为a的数据减速,那么这可能会导致名称冲突。

这种令人羞愧的、非常不直观的行为。所以你说用表达式引号是不可能做到这一点的?
[d | data A=A |]
在顶层,如果没有_1或_0,则生成一个
data A=A
。如果您先用Dec做其他事情,我想您可以更改
namefologe
或忽略它。
runQ (return $ [DataD [] (mkName "A") [] [NormalC (mkName "A") []] []])