在Haskell中是否有(或有可能)有一个反应性的Parsec (或任何其他纯函数解析器)?
简单地说,我希望自己为解析器添加char,并获得足够多的结果,以获得输出。
或者简单得多,我如何在foldr或至少map中做到这一点?
我们是否需要一个不同的版本来支持这种反应行为?
编辑
我的问题特别是关于玻璃钢的。我用了一个解析器作为例子,这是我所能想到的最好的例子来澄清我的问题并给出我所需要的东西的全貌。
我相信玻璃钢不仅仅是UI,对吧?
发布于 2011-07-13 12:54:18
您不能在Parsec中进行联机解析,它必须使用所有输入才能确定是否存在有效的解析。
然而,也有其他的选择。一种可能性是使用Utrecht解析器组合器,它在其特性中具有在线解析功能。
发布于 2011-07-14 07:22:11
我认为称其为“玻璃钢”是不对的,这种东西的正确名称是在线算法,这意味着解析器一收到输入就会产生输出。(与离线算法不同,解析器预先接收整个输入并从中产生一个输出。)
在Haskell中,懒惰的评估使得在线算法的编写变得很容易。Malcom开发了一组特殊的解析器组合器,用于使用延迟评估的在线解析。
发布于 2011-07-15 06:35:23
您可以在Parsec中进行在线解析,但要做到这一点,您需要在类似迭代器的基础上对其进行分层。
Parsec 3能够处理任意的Stream类型,因此您可以创建一个Stream实例,它将当前的“流”视为一个位置,并使用迭代器检索该位置的值。
iteratee-parsec包就是一个这样的例子。
关于迭代和parsec的三层分析提供了另一种方法(警告PDF):
折中之处是构建一个类似迭代器的类型,该类型缓冲最后几个块片段,而不是所有这些片段,以使其能够保持有界的空间利用率,并依赖迭代器机制进行回溯。这是我目前使用的,但我没有任何在线代码。
一旦您通过在Iteratee上运行Parsec来实现倒置控制,就很容易一次给它输入一个字符,看看它是否还能识别任何东西。
https://stackoverflow.com/questions/6675683
复制相似问题