模板Haskell名称引用desugar'x到NameG?

时间:2015-01-11 07:09:17

标签: haskell template-haskell

我是否可以始终期望单个单引号语法可以去除NameG构造函数?例如确实

'x

总是贪吃

(Name (OccName "x") (NameG VarName (PkgName "some-package") (ModName "SomeModule")))

在名称解析之后,这个信息必须始终存在,这是模板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)是否有类似的保证,但我希望它们是相同的。)

1 个答案:

答案 0 :(得分:1)

由于'引用的名称在编译时是已知的,为什么不将名称更改为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),则该失败将在编译时显示。