Haskell:FRP Reactive Parsec?

KA1*_*KA1 10 haskell parsec frp reactive-programming

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

简单地说,我想通过char自己提供解析器char,并获得足够多的结果以获得输出.

或者更简单,我怎么能这样做foldr或者至少map呢?

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

编辑

我的问题特别是关于FRP.我用一个解析器作为例子,这是我能想到的最好的解释我的问题并大致了解我需要的东西.

我相信FRP不只是关于UI,对吗?

Fed*_*ini 8

你不能在Parsec中进行在线解析,它必须消耗所有输入以确定是否存在有效的解析.

然而,有其他选择.一种可能性是使用Utrecht解析器组合器,它在其功能之间进行在线解析.


Hei*_*mus 8

我认为称之为"FRP"是不对的,这种事物的正确名称是在线算法,这意味着解析器在收到输入后立即生成输出.(与离线算法相反,解析器预先接收整个输入并从中生成输出.)

在Haskell中,惰性求值可以轻松编写在线算法.Malcom Wallace开发了一组特殊的解析器组合器,用于在线解析,使用延迟评估.


Edw*_*ETT 6

你可以在Parsec中进行在线解析,但为了做到这一点,你需要将它叠加在像iteratee之类的东西上.

Parsec 3能够处理任意Stream类型,因此您可以创建一个Stream实例,将当前"stream"视为一个位置,并使用iteratee检索该位置的值.

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

另一种方法是通过解析iteratees和parsec上的三连接谈话(警告PDF):

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

一旦你通过在Iteratee上运行Parsec进行反向控制,就可以很容易地一次输入一个字符并查看它是否已经设法识别任何东西.