繁体   English   中英

Haskell:FRP 反应性 Parsec?

[英]Haskell: FRP Reactive Parsec?

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

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

或者更简单,我怎样才能在foldr或至少map中做到这一点?

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

编辑

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

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

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

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

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

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

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

Parsec 3 is capable of working with arbitrary Stream types, so you can make an instance of Stream which views the current 'stream' as a position, and uses an iteratee to retrieve the value at that position.

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM