我是否可以始终期望单个单引号语法可以去除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.html和https://hackage.haskell.org/package/template-haskell-2.8.0.0/docs/src/Language-Haskell-TH-Syntax.html#Name没有说。
(ps我还想知道双单引号语法(例如''T
)是否有类似的保证,但我希望它们是相同的。)
答案 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
),则该失败将在编译时显示。