gpt4 book ai didi

haskell - 模板 Haskell : Is there a function (or special syntax) that parses a String and returns Q Exp?

转载 作者:行者123 更新时间:2023-12-03 12:19:54 29 4
gpt4 key购买 nike

我正在尝试学习一些模板 Haskell 和准引用,并且我正在寻找一个采用 String 的函数并将其解析为 Q Exp ,所以类型是:

String -> Q Exp

尝试搜索hoogle,但我看到的结果与将字符串文字提升到 Q Exp有关,我找到的最接近的是 Language.Haskell.TH.dyn这完全符合我的要求,但仅适用于单个变量。

还有其他选择吗?例如。特殊语法?我只是在熟悉 [||]$() ,所以也许也有为此目的的东西?

我想象它如何工作的一个例子:
runQ (parse "(1+)") == InfixE (Just (LitE (IntegerL 1))) (VarE GHC.Num.+) Nothing

另外,我知道这一点
runQ [| (1+) |] == InfixE (Just (LitE (IntegerL 1))) (VarE GHC.Num.+) Nothing

但这不适用于可变字符串,因为 - 可以理解 - 里面的字符串被视为文字。
runQ [| "(1+)" |] == LitE (StringL "(1+)")

编辑(2015-07-25):我已经开始使用 haskell-src-meta , 到目前为止它似乎运作良好。然而, cabal install 确实需要相当长的时间。 (在我的机器上大约 10 分钟)。真可惜,我的包实际上很小,我想安装是否可以快速。任何人都知 Prop 有较小依赖性的解决方案?

最佳答案

正如大家已经说过的 haskell-src-meta 提供

parsePat :: String -> Either String Pat
parseExp :: String -> Either String Exp
parseType :: String -> Either String Type
parseDecs :: String -> Either String [Dec]

在哪里 Pat , Exp , Type , 和 Dec与来自 Language.Haskell.TH.Syntax 的相同.

Why doesn't GHC expose its own parser?



确实如此。使用 ghci -package ghc 启动 GHCi ( ghc 默认为隐藏包),您可以导入 Parser .它具有解析 String的功能用于模式、表达式、类型和声明的初步 AST(其数据声明在 HsSyn 中)。

OK, then why does there not exist a library that uses this parser and converts its output to be the AST from template-haskell (the one in Language.Haskell.TH.Syntax)?



向内看 HsSyn ,很明显 AST 与 Language.Haskell.TH.Syntax 中的 AST 不太一样.打开两个 HsExpr Exp 并排你会看到后者充满了像 PostTc id <some-other-type> 这样的类型。和 PostRn id <some-other-type> .随着 AST 从解析器传递到重命名器再到类型检查器,这些点点滴滴都被慢慢填充。例如,在进行类型检查之前,我们甚至不知道运算符的固定性!

为了实现我们想要的功能,我们需要运行的不仅仅是解析器(至少还有重命名器和类型检查器,也许更多)。想象一下:每次你想解析一个像 "1 + 2" 这样的小表达式时你仍然需要输入检查一堆导入。即便如此,转换回 Language.Haskell.TH.Syntax 不会是在公园里散步:GHC 有很多特性,比如它自己特殊的全局存储名称和标识符的方式。

Hmmm... but what does GHC do with quasi-quotes?



这是最酷的部分!不像 Exp , HsExpr HsSplice 用于表示接头。查看前两个构造函数的类型:
HsTypedSplice :: id -> LHsExpr id -> HsSplice id.   -- things like [|| 1 + 2 ||]
HsUntypedSplice :: id -> LHsExpr id -> HsSplice id -- things like [| 1 + 2 |]

请注意,它们没有存储 String ,他们已经在存储 AST 了!拼接与 AST 的其余部分同时被解析。就像 AST 的其余部分一样,拼接将传递给重命名器、类型检查器等,缺失的信息将被填充。

So is it fundamentally impossible to use GHC's parser



可能不是。但将其从 GHC 的其余部分中解脱出来可能相当困难。如果要使用 GHC 的解析器,我们还必须运行类型检查器和重命名器,使用像 haskell-src-exts 这样的独立解析器可能更加优雅和简单。 (这是 Haskell-src-meta 所依赖的),它能够一次完成所有事情(例如,固定性是你必须提前给这个解析器的事情之一)。

关于haskell - 模板 Haskell : Is there a function (or special syntax) that parses a String and returns Q Exp?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31412444/

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