11

Haskell 中是否有(或可能有)反应式Parsec(或任何其他纯函数式解析器)?

简而言之,我想逐个字符地为解析器提供数据,并获得与我提供的足够多的结果一样多的结果。

或者更简单,我怎么能做到foldr或至少map

我们是否需要它们的不同版本来支持这种反应行为?

编辑

我的问题特别是关于 FRP。我以解析器为例,这是我能想到的最好的方法来澄清我的问题并全面了解我的需求。

我相信 FRP 不仅仅是关于 UI,对吧?

4

4 回答 4

8

您不能在 Parsec 中进行在线解析,它必须消耗所有输入才能确定是否存在有效解析。

然而,还有其他选择。一种可能是使用Utrecht 解析器组合器,它具有在线解析功能。

于 2011-07-13T12:54:18.710 回答
8

我不认为把这个叫做“FRP”是正确的,这种东西的正确名称是在线算法,这意味着解析器一收到输入就产生输出。(与离线算法相反,解析器预先接收整个输入并从中产生输出。)

在 Haskell 中,惰性求值使编写在线算法变得容易。Malcom Wallace 开发了一组特殊的解析器组合器,用于使用惰性求值的在线解析。

于 2011-07-14T07:22:11.237 回答
6

您可以在 Parsec 中进行在线解析,但要做到这一点,您需要将它放在类似 iteratee 的东西之上。

Parsec 3 能够处理任意 Stream 类型,因此您可以创建一个 Stream 实例,它将当前“流”视为一个位置,并使用一个迭代器来检索该位置的值。

一个这样的例子是iteratee-parsec 包

通过解析关于 iteratees 和 parsec 的 trifecta talk提供了另一种方法(警告 PDF):

一种折衷方案是构建一个类似迭代器的类型,它缓冲最后几个块片段而不是所有块片段,以使其能够保持有限的空间利用率,并依赖迭代器机制进行回溯。这是我目前使用的,但我没有任何在线代码。

一旦你通过在 Iteratee 上运行 Parsec 来反转控制,就很容易一次输入一个字符,看看它是否已经设法识别任何东西。

于 2011-07-15T06:35:23.000 回答
1

看看 attoparsec-conduit,使用正确的解析器,它可能是将字节流转换为已解析数据结构流的有用方法

于 2012-09-07T14:20:19.453 回答