FRP(反应):如何使用filterE?

Yur*_*ras 11 haskell frp

我希望下一个会在一秒内打印"()"10次.但它在一秒钟之后就会挂起.为什么?

adaptE $ fmap print $ filterE (const True) $ atTimes [0.1, 0.2 ..]
Run Code Online (Sandbox Code Playgroud)

我发现它与filterE中使用的liftM有关:

filterE :: (Ord t, Bounded t) => (a -> Bool) -> EventG t a -> EventG t a
filterE p m = justE (liftM f m)
 where
   f a | p a        = Just a
       | otherwise  = Nothing
Run Code Online (Sandbox Code Playgroud)

我试图重新实现filterE使用fmap它似乎工作.为什么?该标准filterE是如何设计使用的?

我发现自己重新实现很多通过所提供的标准功能reactive包(例如diffE,integrate).这是否意味着包装有错误或我以错误的方式使用它?

谢谢!

luq*_*qui 3

根据我的经验,反应式是有问题的,特别是对于Monad实例Event (monadjoin操作有点太严格,我们不确定为什么)。如果可能的话,避免这种情况。响应式是一项实验,代表了通过更多运行时支持可能实现的目标。请参阅 Yampa,以获得更稳定、更可靠、更广泛使用的 FRP 库,即使它的表现力稍差一些。