2014-11-17 26 views
8

Die Funktion changes hat den Typ Frameworks t => Behavior t a -> Moment t (Event t (Future a)). Future ist abstrakt und es gibt nur eine Funktion, die es verbraucht().Warum `` Änderungen `` `` zurückgeben <<

Allerdings kann ich leicht die folgende Funktion schreiben:

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

ein normales (nicht Future) Ereignis zu erhalten.

Stimmt etwas nicht mit dieser Funktion? Wenn nicht, warum hat die ursprüngliche changes Funktion einen restriktiveren Typ?

Antwort

4

Die Funktion changes liefert andere Werte als die von Ihnen beschriebene Funktion changes'. Der entscheidende Punkt ist die folgende:

ein Verhalten von stepper (oder accumB) definiert Betrachten, die zum Zeitpunkt t0 ändern passiert. Welchen Wert hat das Verhalten zu diesem Zeitpunkt? Die Antwort ist, dass das Verhalten den neuen Wert für alle Zeiten annimmt, die streng größer sind als die Zeit der Änderung, t> t0, und dass es immer noch seinen alten Wert zum Zeitpunkt t0 hat. Mit anderen Worten, die Funktion changes' gibt ein Ereignis zurück, dessen Werte die alten Werte des Verhaltens zum Zeitpunkt der Änderung sind. Im Gegensatz dazu gibt die Funktion changes die neuen ("zukünftigen") Werte zurück. Aus verschiedenen Gründen, die mit recursion zu tun haben, sind die neuen Werte in einen Future Typ verpackt, so dass sie erst in der Phase erreicht werden können.

EDIT: Tobias hat ein Bild zur Illustration gezeichnet:

+0

Sinn macht. Ich zeichnete ein [Bild] (http://i.imgur.com/tVRDv2r.png) zur Veranschaulichung. –

+0

Verknüpft mit der Antwort. :-) –