haskell - 如何删除reactive-banana中的重复事件

标签 haskell reactive-programming frp reactive-banana

在reactive-banana中,我有一个事件流,它产生一系列数字,其中一些数字连续重复几次(我不关心所有重复项,只关心连续重复项)。如何修改该事件流以仅包含非连续重复项?

我尝试使用更改将其转换为一种行为,认为该行为仅在事件是新数字时才会“更改”,但每次收到新的输入事件时该行为都会触发更改事件。

最佳答案

请注意,changes 函数应该用于绑定(bind)到 GUI 工具包等,它不应该用于常规编程事件和行为。

抑制重复事件发生的函数可以用 mapAccumfilterJust 组合符表示,如下

skipEqual :: Eq a => Event t a -> Event t a
skipEqual = filterJust . fst . mapAccum Nothing . fmap f
    where
    f y (Just x) = if x == y then (Nothing,Just x) else (Just y,Just y)
    f y Nothing  = (Just y, Just y)

test = interpretModel skipEqual $ map (:[]) [1 :: Int,1,2,3,3,2]

运行测试给出

*Main> test
[[1],[],[2],[3],[],[2]]

根据需要。

换句话说,您可以简单地将 Event 想象为一个事件列表,然后将您喜爱的“列表”组合器应用于其中。

关于haskell - 如何删除reactive-banana中的重复事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9996377/

相关文章:

Java - 响应式(Reactive)编程与事件监听器

java - 等待ParallelFlux完成

java - 将多个异步 Observable<List> 减少为一个 Observable<List>

haskell - active 香蕉 : Bindings

events - 与传统 FRP 框架相比,Netwire 中的事件处理

haskell - 在 haskell 中传递变量的 Monad

定义平均值所需的 Fractional Int 实例

Haskell 持久 : Is possible to select all rows by field that contains specified value

haskell - 给定 bool 值列表的列表,返回 bool 值

haskell - Netwire 中的跳跃机制