2014-11-17 6 views
8

La funzione changes ha tipo Frameworks t => Behavior t a -> Moment t (Event t (Future a)). Future è astratto e c'è solo una funzione che lo consuma (reactimate').Perché `changes` restituisce` Event t (Future a) `

Tuttavia, posso facilmente scrivere la seguente funzione:

changes' :: Frameworks t => Behavior t a -> Moment t (Event t a) 
changes' b = fmap (fmap const b <@>) (changes b) 

per ottenere un normale (non Future) evento.

C'è qualcosa di sbagliato in questa funzione? In caso contrario, perché la funzione originale changes ha un tipo più restrittivo?

risposta

4

La funzione changes restituisce valori diversi dalla funzione changes' descritta. Il punto chiave è la seguente:

consideri un comportamento definito da stepper (o accumB), che avviene a modifica in tempo t0 . Che valore ha il comportamento in questo momento? La risposta è che il comportamento assume il nuovo valore per tutte le volte che è rigorosamente più grande rispetto all'ora di modifica, t> t0 e che ha ancora il suo vecchio valore al momento t0. In altre parole, la funzione changes' restituisce un evento i cui valori sono i vecchi valori del comportamento al momento della modifica. Al contrario, la funzione changes restituisce i nuovi valori ("futuri"). Per vari motivi che riguardano recursion, i nuovi valori sono racchiusi in un tipo Future, pertanto non è possibile accedervi fino alla fase reactimate'.

EDIT: Tobias ha disegnato un quadro per l'illustrazione:

+0

ha un senso. Ho disegnato una [foto] (http://i.imgur.com/tVRDv2r.png) per illustrare. –

+0

Collegato ad esso dalla risposta. :-) –