如何删除反应性香蕉中的重复事件

Orc*_*lev 7 haskell frp reactive-programming reactive-banana

在反应性香蕉中,我有一个产生一系列数字的事件流,其中一些数字连续重复几次(我不关心所有重复数据,只关注连续重复数据).如何修改该事件流以仅包含非连续重复项?

我尝试使用更改将其转换为行为,认为行为只会在事件是新数字时"更改",而是每次收到新的输入事件时行为都会触发更改事件.

Hei*_*mus 6

请注意,该changes函数应用于绑定到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]
Run Code Online (Sandbox Code Playgroud)

跑步test

*Main> test
[[1],[],[2],[3],[],[2]]
Run Code Online (Sandbox Code Playgroud)

如预期的.

换句话说,你可以简单地想象 Event为出现的列表,然后运用你的心爱的"清单"组合程序这一点.