Sono nuovo alla banana reattiva e al FRP in generale, quindi mi scuso se mi manca qualcosa di ovvio.Implementazione di zipE :: Evento t a -> Evento t b -> Evento t (a, b)
Per my project (a front-end GDB/MI) Utilizzo banana reattiva (versione 0.6.0.0) sia per la GUI che per i moduli logici front-end. Il primo funziona alla grande ma per il secondo ho apparentemente bisogno di ulteriori combinatori.
Uno di questi è zipE :: Event t a -> Event t b -> Event t (a, b)
. Purtroppo, tutto quello che potevo venire in mente è una soluzione in monade NetworkDescription che utilizza changes
e non è generica nelle tipologie di evento:
zipE :: Event t Int -> Event t String -> NetworkDescription t (Event t (Int, String))
zipE ea eb = changes $ (,) <$> stepper 0 ea <*> stepper "" eb
Naturalmente, io non sono soddisfatto di questo. Quindi volevo chiedere come implementare una generica funzione zipE senza usare changes
(che è sconsigliato usare per scopi non-GUI).
Altri tentativi non riusciti, ad es.
zipE :: Num a => Event t a -> Event t b -> Event t (a,b)
zipE ea eb = apply (stepper (0,) ((,) <$> ea)) eb
risultati dei primi elementi delle tuple di essere spostati da una - Credo che a causa della "leggero ritardo" introdotto da stepper
. Ma non vedo come ottenere un comportamento da un evento senza stepper
(o accumB
per quella questione) e non vedo come applicare una funzione a un evento senza un comportamento. E nel complesso, non vedo come fornire un valore iniziale per il passo passo nel caso di un tipo generico.
'ea' e' eb' non spareranno allo stesso tempo. (Se sai che stanno per sparare allo stesso tempo perché sono entrambi derivati dallo stesso evento sottostante, è probabilmente meglio rielaborare quell'evento sottostante.) Cosa vuoi che succeda quando uno spara e l'altro no? t? – dave4420
Dave, hai ragione. Ho bisogno di un design diverso per la mia rete di eventi: -/Grazie per averlo indicato. – copton
Ho effettivamente richiesto una rete di eventi diversa.Inizialmente, volevo comprimere i due eventi per alimentare le tuple in 'f :: (a, b) -> IO()'. Quello che ho ora è invece 'f :: a -> b -> IO()' e 'reactimate $ (f <$> stepper 0 aE) <@> bE'. – copton