使用当前范围在模板haskell中生成动态名称

埃里克·黑塞林克(Erik Hesselink)

我正在写一个模板haskell拼接,并且正在努力生成正确的Names。如果要生成一个已知名称(例如,一个函数f),可以使用'f这需要f在我定义接头的范围内,而不是在使用的范围内,而这正是我想要的。

现在,我想要相同的东西,但要使用动态名称。例如,假设我的接头将一个n :: Int作为参数。我想生成"f" ++ show n一个Name,抬头看着接头定义站点,而不是使用站点。

我尝试了几种选择:mkName并且lookupValueName都要求名称在使用站点的范围内。单引号语法需要一个文字名称,而不是一个动态名称。

最后,我开始尝试mkNameG由于函数来自与我使用它们时相同的程序包,因此我从程序包名称开始,但这给出了错误Can't find interface-file declaration for variable the-package-name:Some.Module.f0在阅读一些资料后,我找到了使用软件包名称的地方"main"这似乎在GHCi中有效,但是在编译时我仍然遇到相同的错误。

有什么办法吗?我当然可以列举所有选项,但是我想避免这种情况,因为本练习的重点是使代码更具动态性。

里德·巴顿(Reid Barton)

我想您可以通过从特定文件中提取程序包名称Name 'f0,然后将其传递给来实现mkNameG_v这可能不是一个好主意,原因有两个:

  • 编写程序会'f检查标识符是否f确实在范围内,而您可以将任何东西传递给mkNameG并且不会出错,直到您尝试以Name某种方式使用。您必须以其他方式确保仅Name针对实际存在的标识符构建,或者recover使用时从错误构建Name(除非您只是想让GHC因看到的错误而失败)。

  • 写作'f也算作的用法f未使用的未导出定义将被简单丢弃,因此您将无法使用引用它们mkNameG您将必须找到其他方法来确保"f" ++ show n使用标识符。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章