FRP(响应式编程):如何使用filterE?

11

我期望下面的代码每秒钟会打印出10次"()"。但是它在一秒钟后就停止了。为什么呢?

adaptE $ fmap print $ filterE (const True) $ atTimes [0.1, 0.2 ..]

我发现这与在 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

我尝试使用fmap重新实现filterE,似乎可以正常工作。为什么呢? 标准的filterE应该如何使用?
我发现自己不得不重新实现许多由reactive包提供的标准函数(例如diffEintegrate)。这是意味着该包存在缺陷还是我使用方法错误?
谢谢!

fmap,<$>,liftA和liftM是相同的。 - kennytm
它们应该是相同的。但是 adaptE . fmap print $ atTimes [0.1, 0.2 .. 10] 可以在10秒内运行,而 adaptE . liftM print $ atTimes [0.1, 0.2 .. 10] 永远不会返回。为什么? - Yuras
响应式编程存在很多漏洞。 - luqui
@luqui,看起来你的回答是唯一可接受的。你能否把它变成一个真正的答案,这样我就可以接受它了吗? - Yuras
1个回答

3

根据我的经验,反应式编程存在缺陷,特别是在 EventMonad 实例方面(单子 join 操作有点过于严格,我们并不确定原因)。如果可能的话,请避免使用。反应式编程只是一个实验,代表了在更多运行时支持下可能出现的情况。查看 Yampa 获取一个更加稳定、可靠和经过充分验证的 FRP 库,即使它的表达能力稍微有些弱。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接