You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

John Hughes 基于Arrow的确定性LL(1)解析实现问题咨询

基于Arrow的解析器实现疑问

我希望基于John Hughes的论文《Generalizing Monads to Arrows》实现一款解析器,在阅读论文并尝试复现其代码的过程中,我发现部分逻辑无法完全理解。论文中有一节内容基于Swierstra和Duponchel的论文《Deterministic, error-correcting combinator parsers》,使用Arrow实现了一套解析器,定义的解析器类型如下:

data StaticParser ch = SP Bool [ch]
data DynamicParser ch a b = DP (a, [ch]) -> (b, [ch])
data Parser ch a b = P (StaticParser ch) (DynamicParser ch a b)

其组合运算符的定义大致如下:

(.) :: Parser ch b c -> Parser ch a b -> Parser ch a c
  P (SP e2 st2) (DP f2) . P (SP e1 st1) (DP f1) =
  P (SP (e1 && e2) (st1 `union` if e1 then st2 else []))
    (DP $ f2 . f1)

我遇到的问题是:解析器组合表达式q . p会“丢失”q的起始符号集合。我想到的一种可能的解释是,Hughes要求所有DynamicParser都是全函数,因此符号解析器的类型签名应为symbol :: ch -> Parser ch a (Maybe ch),而非symbol :: ch -> Parser ch a ch。但这种设计仍然不够合理,因为我们需要在StaticParser和DynamicParser中重复存储起始符号信息。

另一个问题是几乎所有解析器都存在抛出错误的可能,这意味着我们需要大量使用Maybe或Either类型,本质上会遇到“Monad不可组合”的问题。这个问题可以通过重写DynamicParser本身来支持错误处理,或者将其实现为Arrow transformer来解决,但这已经大幅偏离了论文的设计思路。

上述问题在论文中均未提及,且该解析器的设计看起来是天然可正常运行的,因此我认为自己遗漏了某些基础的设计前提,希望有人能指出我理解有误的地方。


内容的提问来源于stack exchange,提问作者Ace shinigami

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 11:57:02