[英]does Template Haskell name quoting desugar 'x to NameG?
我是否总能期望单引号语法NameG
为NameG
构造函数? 例如
'x
总是去糖
(Name (OccName "x") (NameG VarName (PkgName "some-package") (ModName "SomeModule")))
在名称解析之后,此信息必须始终存在于此位置,这是Template Haskell运行的阶段,对吗? 尽管我只想引用顶级名称,但我无法引用本地名称。
上下文:我想编写一个返回唯一标识符的函数。 这是部分函数,因为我不能限制输入,因为Haskell模板没有任何GADT或任何东西,而我不想将输出包装在不确定性中。 而且我也不想使用准引号或拼接,如果'
可以的话。 我想证明此部分函数按上述用法使用时在运行时是安全的, 引用同一模块中的顶级名称 ,如下所示:
name (Name occ (NameG _ pkg mod)) = Unique occ pkg mod
我想要一个像这样的功能:
(<=>) :: Name -> a -> Named a
给出:
data Named a = Named a Unique
注释变量绑定:
x = 'x
<=> ...
无需用户使用繁重的拼接语法$(name ...)
并在编译时调用拼接:
x = $(name 'x)
<=> ...
用户将为配置编写大量此类文件。
https://downloads.haskell.org/~ghc/7.8.3/docs/html/users_guide/template-haskell.html和https://hackage.haskell.org/package/template-haskell-2.8.0.0/docs /src/Language-Haskell-TH-Syntax.html#Name没说。
(ps我也想知道双单引号语法(例如''T
)是否具有类似的保证,尽管我希望它们是相同的)。
由于在编译时已知'引用名称,所以为什么不将名称更改为Q monad:
name :: Name -> ExpQ
name (Name occ (NameG _ pkg mod)) = [| Unique occ pkg mod |]
name n = fail $ "invalid name: "++ gshow n
然后使用$(name 'show) :: Unique
代替name 'show :: Unique
。 如果您得到一个无效的Name
(例如有人使用mkName
),那么该错误将在编译时显示。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.