繁体   English   中英

Haskell模板的名称在NameG上引用了desugar'x吗?

[英]does Template Haskell name quoting desugar 'x to NameG?

我是否总能期望单引号语法NameGNameG构造函数? 例如

'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.htmlhttps://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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM