一般来说,我对反应性香蕉和 FRP 很陌生,所以如果我遗漏了一些明显的东西,我深表歉意。
对于我的项目(一个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
当然,我对此并不满意。因此,我想问如何在不使用的情况下实现一个通用的 zipE 函数changes
(不鼓励将其用于非 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
就此而言)的事件中获取行为,也看不到如何将函数应用于没有行为的事件。总的来说,在泛型类型的情况下,我看不到如何为步进器提供初始值。