【发布时间】:2012-07-29 08:47:58
【问题描述】:
我对反应性香蕉和 FRP 不熟悉,所以如果我遗漏了一些明显的东西,我深表歉意。
对于my project(GDB/MI 前端),我对 GUI 和前端逻辑模块都使用响应式香蕉(版本 0.6.0.0)。前者效果很好,但对于后者,我显然需要额外的组合器。
其中一个是zipE :: Event t a -> Event t b -> Event t (a, b)。不幸的是,我能想出的只是 NetworkDescription monad 中的一个解决方案,它使用 changes 并且在事件类型中不是通用的:
zipE :: Event t Int -> Event t String -> NetworkDescription t (Event t (Int, String))
zipE ea eb = changes $ (,) <$> stepper 0 ea <*> stepper "" eb
当然,我对此并不满意。因此,我想问如何在不使用changes 的情况下实现一个通用的 zipE 函数(不鼓励将其用于非 GUI 目的)。
其他尝试失败,例如
zipE :: Num a => Event t a -> Event t b -> Event t (a,b)
zipE ea eb = apply (stepper (0,) ((,) <$> ea)) eb
导致元组的第一个元素被移动一个 - 我猜是由于stepper 引入的“轻微延迟”。但是我看不到如何从没有stepper(或accumB)的事件中获取行为,我看不到如何将函数应用于没有行为的事件。总的来说,在泛型类型的情况下,我看不到如何为步进器提供初始值。
【问题讨论】:
-
ea和eb不会同时触发。 (如果您知道它们将同时触发,因为它们都源自相同的基础事件,那么最好重新处理该基础事件。)当一个触发而另一个不触发时,您希望发生什么? t? -
戴夫,你是对的。我的活动网络需要不同的设计:-/ 感谢您指出这一点。
-
我确实需要一个不同的事件网络。最初,我想压缩这两个事件以将元组输入
f :: (a,b) -> IO ()。我现在拥有的是f :: a -> b -> IO ()和reactimate $ (f <$> stepper 0 aE) <@> bE。
标签: haskell reactive-programming frp reactive-banana