gpt4 book ai didi

haskell - 模板 Haskell 名称是否将 desugar 'x 引用到 NameG?

转载 作者:行者123 更新时间:2023-12-01 05:06:39 26 4
gpt4 key购买 nike

我可以一直期望单引号语法对 NameG 进行脱糖吗?构造函数?例如做

'x

总是脱糖
(Name (OccName "x") (NameG VarName (PkgName "some-package") (ModName "SomeModule")))

在名称解析之后,此信息必须始终存在,这就是 Template Haskell 运行的阶段,对吗?而且我无法引用本地名称,尽管我只对引用顶级名称感兴趣。

上下文:我想编写一个返回唯一限定标识符的函数。这是一个部分函数,​​因为我无法限制输入,因为 Template Haskell 没有任何 GADT 或任何东西,而我不想将输出包装在不确定中。如果 ',我不想使用准引用器或拼接器。会做。我想证明这个偏函数在运行时是安全的,如上使用 引用同一模块中的顶级名称 ,给定:
name (Name occ (NameG _ pkg mod)) = Unique occ pkg mod

我想要一个像这样的功能:
(<=>) :: Name -> a -> Named a

给定:
data Named a = Named a Unique

注释变量绑定(bind):
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 ),该失败将在编译时出现。

关于haskell - 模板 Haskell 名称是否将 desugar 'x 引用到 NameG?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27884817/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com