[英]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.