是否可以使用模板 Haskell 发出原始源代码?

Is it possible to emit raw source code with Template Haskell?

假设我有一个包含有效 Haskell 代码的 String(或 Text 或其他)。有没有办法使用模板 Haskell 将其转换为 [Dec]

我很确定 AST 不会直接进入 GHC,所以无论如何都会有打印和解析阶段。

这会很棒,因为它允许 TH 有不同的 "backends"。例如,您可以使用来自 haskell-src-exts 的 AST,它比 TH 支持更多 Haskell 语法。

I'm pretty sure the AST doesn't directly go to GHC so there's going to be a printing and then a parsing stage anyways.

你为什么会这么想?不是这样的,TH AST直接转换为GHC的内部AST;它永远不会在该过程中的任何时候转换回文本。 (如果是的话,那就很奇怪了。)

不过,如果模板 Haskell 公开一种将 Haskell 源代码解析为表达式、类型和声明的方法,那会更好一些,基本上公开各种 e 背后的解析器, td 模板 Haskell 中内置的引号。不幸的是,它没有,而且我认为目前没有任何改变它的计划。

目前,您需要通过 haskell-src-exts。这有点不太理想,因为 haskell-src-exts 的解析器和 GHC 之间存在 差异,但它与您目前将要获得的一样好。为了减轻痛苦,a package called haskell-src-meta 连接了 haskell-src-extstemplate-haskell

对于您的用例,您可以使用 Language.Haskell.Meta.Parse 中的 parseDecs 函数,其类型为 String -> Either String [Dec],这正是您要查找的类型。