Soy nuevo en banana reactiva y FRP en general, así que me disculpo si me falta algo obvio.Implementación de zipE :: Evento t a -> Evento t b -> Evento t (a, b)
Para my project (a GDB/MI front-end) Estoy usando reactive banana (versión 0.6.0.0) tanto para la interfaz gráfica de usuario como para los módulos lógicos frontales. El primero funciona muy bien, pero para este último aparentemente necesito otros combinadores.
Uno de ellos es zipE :: Event t a -> Event t b -> Event t (a, b)
. Por desgracia, todo lo que podía llegar a es una solución en la mónada NetworkDescription que utiliza changes
y no es genérica en los tipos de eventos:
zipE :: Event t Int -> Event t String -> NetworkDescription t (Event t (Int, String))
zipE ea eb = changes $ (,) <$> stepper 0 ea <*> stepper "" eb
Por supuesto, no estoy satisfecho con esto. Por lo tanto, quería preguntar cómo implementar una función zipE genérica sin usar changes
(que se desaconseja su uso para fines no relacionados con la GUI).
Otros intentos han fallado, p.
zipE :: Num a => Event t a -> Event t b -> Event t (a,b)
zipE ea eb = apply (stepper (0,) ((,) <$> ea)) eb
resultados en los primeros elementos de las tuplas se cambiaron por uno - supongo que debido a la "ligero retraso" introducido por stepper
. Pero no veo cómo obtener un comportamiento de un evento sin stepper
(o accumB
para el caso) y no veo cómo aplicar una función a un evento sin un comportamiento. Y, en general, no veo cómo proporcionar un valor inicial a Stepper en el caso de un tipo genérico.
'ea' y' eb' no van a disparar al mismo tiempo. (Si sabe que van a disparar al mismo tiempo porque ambos se derivan del mismo evento subyacente, probablemente sea mejor reprocesar ese evento subyacente). ¿Qué quiere que suceda cuando uno dispara y el otro no? t? – dave4420
Dave, tienes razón. Necesito un diseño diferente para mi red de eventos: -/Gracias por señalar esto. – copton
De hecho, necesitaba una red de eventos diferente.Inicialmente, quise comprimir los dos eventos para alimentar las tuplas en 'f :: (a, b) -> IO()'. Lo que tengo ahora es 'f :: a -> b -> IO()' y 'reactimate $ (f <$> stepper 0 aE) <@> bE'. – copton