2013-10-29 14 views
8

Ho setacciato la documentazione di reactive-banana e non riesco a trovare un modo per specificare ritardi temporali espliciti. Ad esempio, vorrei prendere uno Event t a e spostare tutte le sue occorrenze 1 secondo nel futuro; oppure ottieni un evento che spara 1 secondo da adesso (entro Moment t); o qualcosa del genere. I ritardi espliciti sono rappresentabili nella banana reattiva? In caso contrario, in che modo gli utenti implementano, ad es., L'eco dell'ingresso ritardato di un secondo?ritardi di banana reattiva

risposta

4

Come Ben indica, questo è corretto: la banana reattiva non è una nozione incorporata di tempo e ritardi.

Il motivo principale è che è difficile garantire che il tempo logico e il tempo reale siano d'accordo. Cosa succede quando un clic del mouse avviene in tempo reale prima del tempo logico di un evento che non è ancora stato calcolato, vale a dire il cui inganno in tempo reale dietro il suo tempo logico?

Tuttavia, è ancora possibile gestire il tempo utilizzando eventi timer esterni. Dai un'occhiata all'esempio Wave.hs.

3

Non sono un esperto in alcun modo, ma ho usato una banana reattiva più vecchia per un programma con esattamente questo bisogno (non ho il codice in mano al momento, sfortunatamente).

Io penso che i ritardi espliciti non si adattano naturalmente super-all'interno quadro reattivo-banane perché sei sempre implicitamente che fare con una sorta di tempo astratto. Ritardare a intervalli regolari richiede di affrontare la nozione di tempo del mondo reale. Posso vedere che sarebbe molto difficile dire cosa significhi union event (delay 1.0 event) nel senso del modello autorevole dove type Event a = [Maybe a]: dovrebbe essere [a, b, a, b] o [a, a, b, b]? Come ho pensato, il problema è che quale di questi due risultati dovrebbe essere non specificato senza considerare i dettagli operativi di runtime.

Ma puoi farlo "attorno" alla struttura della banana reattiva collegando un'azione IO all'evento che vuoi ritardare che dorme per un po '(non nel thread principale, ovviamente) e poi lancia un evento diverso . Credo di essere riuscito a racchiudere tutta quella logica in una funzione che potrei chiamare dal monad NetworkDescription (questo era prima che esistesse il monad Moment) per ottenere il mio nuovo evento ritardato.

Problemi correlati