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?的主要内容,如果未能解决你的问题,请参考以下文章

推荐阅读/教程以了解反应性香蕉 FRP 库 [关闭]

Haskell语言学习笔记(46)Parsec

Haskell语言学习笔记(57)Parsec

An introduction to parsing text in Haskell with Parsec

选择哪种 FRP 包? [关闭]

在沙箱中安装了 parsec,但在 ghci 中尝试加载文件时找不到库