Haskell 无功电源中的动态事件切换导致严重泄漏

Haskell 无功电源中的动态事件切换导致严重泄漏,haskell,frp,reactive-banana,Haskell,Frp,Reactive Banana,我不确定这种行为是预期的(即我误用了Reactive.Banana.Switch)还是bug 假设我有两个类似类型的输入行为,我想根据一个事件在它们之间切换。我写了这个函数: switchBehaviors :: Behavior t a -- | Behavior to yield initially and after "True" events -> Behavior t a -- | Behavior to yield after "False" events

我不确定这种行为是预期的(即我误用了Reactive.Banana.Switch)还是bug

假设我有两个类似类型的输入行为,我想根据一个事件在它们之间切换。我写了这个函数:

switchBehaviors :: 
      Behavior t a -- | Behavior to yield initially and after "True" events
   -> Behavior t a -- | Behavior to yield after "False" events
   -> Event t Bool -- | Select between behaviors
   -> Moment t (Behavior t a)
switchBehaviors t f es = do
    t' <- trimB t
    f' <- trimB f
    return $ switchB t $ (\e -> if e then t' else f') <$> es
切换行为::
行为t——最初和“真实”事件之后屈服的行为
->行为TA--“错误”事件后屈服的行为
->事件t Bool--|在行为之间进行选择
->力矩t(行为t a)
切换行为t f es=do

如果您对选择输入使用
行为
,并且回忆起
行为
Applicative
的一个实例,那么在不进行动态切换的情况下,此行为实际上是微不足道的。当我问这个问题时,我并没有真正内化
fxyz…
这个习惯用法,所以这里有一个像我这样的人明确的解决方法:

switchBehaviors 
    :: Behavior t a    -- | Behavior to yield when it's "True"
    -> Behavior t a    -- | Behavior to yield when it's "False"
    -> Behavior t Bool -- | Select between behaviors
    -> Behavior t a
switchBehaviors t f es = 
    (\e x y -> if e then x else y) <$> es <*> t <*> f
切换行为
::行为t是--“真实”时屈服的行为
->行为t是--“错误”时屈服的行为
->行为t布尔--|在行为之间进行选择
->行为学
开关行为t f es=
(\e x y->如果是e,那么x其他y)是t f

(Heinrich Apfelmus在一篇评论中提出了第一个问题。正如他所指出的,
Reactive.Banana.Switch
仍处于实验阶段,其性能特征正在改善。)

Reactive Banana的0.7版尚未对动态切换事件实施垃圾收集,所以任何非常动态的东西都可能会占用空间。我正在努力。:-)@HeinrichApfelmus这个虫子还存在吗?今天我尝试了一个动态切换的实验(按键),在10-20次按键后,我的程序变得没有响应,至少有一次甚至因为堆栈溢出而崩溃。@JasonDagit开发版本修复了一些可能导致问题的额外空间泄漏。然而,我还没有开始为动态事件切换实现垃圾收集。