2012-09-20 2 views
7

Sono in procinto di insegnarmi FRP e Reactive-banana mentre scrivo quello che spero sarà un tutorial più utile per quelli che mi seguono. Puoi controllare i miei progressi sul tutorial here.Perché non ci sono funzioni per la creazione di eventi da non-eventi in banana reattiva?

Sono bloccato nel tentativo di implementare i semplici esempi di rumore di beepy utilizzando eventi. So che ho bisogno di fare qualcosa di simile:

reactimate $ fmap (uncurry playNote) myEvent 

nel mio NetworkDescription, ma non riesco a capire come semplicemente la rete fare la stessa cosa più volte, o fare qualcosa una volta. Idealmente, sto cercando per cose come questa:

once :: a -> Event t a 
repeatWithDelay :: Event t a -> Time -> Event t a 
concatWithDelay :: Event t a -> Event t a -> Time -> Event t a 

Il Time tipo sopra è solo uno stand-in per qualsiasi misurazione del tempo si finisce per utilizzare. Devo collegare l'ora del sistema come comportamento per attivare le funzioni di "ritardo"? Sembra più complicato del necessario.

Grazie in anticipo,

Echo Nolan

EDIT: Ok i tipi per repeatWithDelay e concatWithDelay non hanno senso. Ecco cosa intendevo davvero.

repeatWithDelay :: a -> Time -> Event t a 
concatWithDelay :: a -> a -> Time -> Event t a 
+0

Come utilizzare un timer per generare eventi? – AndrewC

risposta

4

ho scelto di non includere tali funzioni nel modello di base per ora, perché tempo solleva varie sfide per consistenza. Ad esempio, se si prevede che due eventi avvengano tra 5 secondi, dovrebbero essere simultanei? Se no, quale dovrebbe essere il primo? Penso che il modello di base dovrebbe essere suscettibile di prove formali, ma questo non funziona con misurazioni temporali fisiche effettive.

Detto questo, ho intenzione di includere tali funzioni in modo "funzionano, ma non garantiscono". Il motivo principale per cui non l'ho ancora fatto è che non c'è nessuna scelta canonica per la misurazione del tempo. Diverse applicazioni hanno esigenze diverse, a volte si desidera una risoluzione di nanosecondi, a volte si desidera utilizzare i timer dalla struttura della GUI e talvolta si desidera sincronizzarsi con un clock MIDI esterno. In altre parole, si desidera che la funzione basata sul tempo funzioni genericamente con molte implementazioni del timer, ed è solo con reactive-banana-0.7.0 che ho trovato un buon design API per questo.

Naturalmente, è già possibile implementare la propria funzione basata sul tempo utilizzando i timer. L'esempio Wave.hs dimostra come farlo. Un altro esempio è quello di Henning Thielemann reactive-balsa library, che implementa vari combinatori basati sul tempo per elaborare i dati MIDI in tempo reale.