Haskell:FRP 反应性 Parsec?
Posted
技术标签:
【中文标题】Haskell:FRP 反应性 Parsec?【英文标题】:Haskell: FRP Reactive Parsec? 【发布时间】:2011-10-04 06:39:51 【问题描述】:Haskell 中是否有(或可能有)反应式Parsec
(或任何其他纯函数式解析器)?
简单地说,我想逐个字符地为解析器提供数据,并获得与我提供的足够多的结果一样多的结果。
或者更简单,我如何在foldr
或至少在map
中做到这一点?
我们是否需要它们的不同版本来支持这种反应性行为?
编辑
我的问题特别是关于 FRP。我以解析器为例,这是我能想到的最好的方法来澄清我的问题并全面了解我的需求。
我相信 FRP 不仅仅是 UI,对吧?
【问题讨论】:
Attoparsec 支持增量解析,如果这是你想要的? 【参考方案1】:您不能在 Parsec 中进行在线解析,它必须消耗所有输入才能确定是否存在有效的解析。
但是还有其他选择。 一种可能是使用Utrecht parser combinators,它的功能中有在线解析。
【讨论】:
【参考方案2】:我觉得把这个叫做“FRP”是不对的,这种东西的正确名字是online algorithm,意思是解析器一收到输入就产生输出. (与离线算法相反,解析器预先接收整个输入并从中生成输出。)
在 Haskell 中,惰性求值使编写在线算法变得容易。 Malcom Wallace 开发了一组特殊的解析器组合器,用于使用惰性求值的在线解析。
Polyparse - hackage 库。 Partial parsing: combining choice with commitment - 设计文章。【讨论】:
【参考方案3】:您可以在 Parsec 中进行在线解析,但要做到这一点,您需要将它放在类似 iteratee 的东西之上。
Parsec 3 能够处理任意 Stream 类型,因此您可以创建一个 Stream 实例,将当前“流”视为一个位置,并使用迭代器检索该位置的值。
iteratee-parsec package 就是一个这样的例子。
parsing trifecta talk on iteratees and parsec 提供了另一种方法(警告 PDF):
一种折衷方案是构建一个类似迭代器的类型,它缓冲最后几个块片段而不是所有块片段,以使其能够保持有限的空间利用率,并依赖迭代器机制进行回溯。这是我目前使用的,但我没有任何在线代码。
一旦您通过在 Iteratee 上运行 Parsec 来反转控制,就很容易一次输入一个字符,看看它是否已经设法识别任何内容。
【讨论】:
【参考方案4】:看看 attoparsec-conduit,如果使用正确的解析器,它可能是将字节流转换为已解析数据结构流的有用方法
【讨论】:
以上是关于Haskell:FRP 反应性 Parsec?的主要内容,如果未能解决你的问题,请参考以下文章