【问题标题】:How to use Template Haskell to get the body of function?如何使用 Template Haskell 获取函数体?
【发布时间】:2012-12-08 15:15:02
【问题描述】:

目前我正在尝试从 Haskell 子集进行翻译,而无需处理所有解析、类型检查等问题。文档并没有帮助我找出一个函数来通过它的名称获取函数的主体(所有定义)。

此调用的上下文应类似于

fac 0 = 1
fac x = z * fac (x - 1)

getBody = ...

main = do
    x <- runQ $ getBody [| fac |]
    print x

有谁知道

  1. TH 上是否有一些好的和最新的文档(不是 Hackage 上的参考)或
  2. 如何制作getBody?

【问题讨论】:

  • 你想在这里用runQ做什么?可以肯定的是,在运行时尝试使用 TH 是无法获得想要的信息的。

标签: haskell template-haskell


【解决方案1】:

一般来说,使用 TH 查找某事物定义的方法是使用 reify 函数。然而:

看来您需要另找一条路线。您是否考虑过使用 the haskell-src-exts package 进行解析和/或 GHC API 或基于它的东西?

【讨论】:

  • 是的,我们不能在运行时使用 reify,但我们可以使用它返回的数据。它看起来像这样(提到由于 GHC 阶段限制,此代码需要拆分为 2 个模块;也在 GHCi 中运行):conv1 (TyConI x) = [| TyConI $(conv2 x) |]conv2 (DataD _ name _ _ _) = [| DataD [] (mkName $(return $ LitE $ stringL $ show name)) [] [] [] |]main = print $(reify ''Int &gt;&gt;= conv1) 此外,reify 将为 调用返回 AST 的功能,但不是它的身体,反正。应该有 reifyDecl 函数,确实没有。我真的很感谢你的帮助。谢谢。
  • @polkovnikov.ph:在某事物的名称上使用reify 通常确实会给您声明,当这有意义时——对于一个类型,它将为您提供构造函数列表,@987654335 @list 等等。 reifying 一个函数的名称会给你一个 VarI 的信息,它有一个 Maybe Dec 值,即一个声明。如果我理解你想要什么,reify 会这样做,只是现在没有实施,因为显然很少有人想要它。
  • 致任何可能阅读此内容的人:我有兴趣在不久的将来开发此功能。我真的可以使用它。
  • @jtobin:如果您还没有,请参阅 GHC Trac 上的 ghc.haskell.org/trac/ghc/ticket/1831,我认为这是同一件事。
  • @jtobin 很高兴听到这个消息。我已经给你发了一封电子邮件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-09
  • 2014-01-03
  • 2013-02-01
  • 2023-03-26
  • 2020-12-11
相关资源
最近更新 更多