FRP(反应式):如何使用 filterS?

Posted

技术标签:

【中文标题】FRP(反应式):如何使用 filterS?【英文标题】:FRP (reactive): How to use filterE? 【发布时间】:2011-05-06 00:29:24 【问题描述】:

我预计下一个将在一秒钟内打印 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 are the same. 它们应该是一样的。但是adaptE . fmap print $ atTimes [0.1, 0.2 .. 10] 工作 10 秒,adaptE . liftM print $ atTimes [0.1, 0.2 .. 10] 永远不会返回。为什么? reactive 有很多问题 @luqui,看来你的回答是唯一可以接受的)你能不能把它变成一个真实的答案,这样我才能接受? 【参考方案1】:

根据我的经验,响应式是错误的,特别是对于 EventMonad 实例(monad join 操作有点过于严格,我们不确定为什么)。尽可能避免这种情况。 Reactive 是一个实验,它代表了更多运行时支持的可能性。请参阅 Yampa 以获得更稳定、可靠和广泛传播的 FRP 库,即使它的表现力稍差。

【讨论】:

以上是关于FRP(反应式):如何使用 filterS?的主要内容,如果未能解决你的问题,请参考以下文章

Haskell:FRP 反应性 Parsec?

选择哪种 FRP 包? [关闭]

推荐阅读/教程以了解反应性香蕉 FRP 库 [关闭]

函数式响应式编程-FRP简介

推拉式FRP在实现游戏时有帮助吗?

如何加粗最后一行反应表达?