2014-11-17 9 views
8

Funkcja changes ma typ Frameworks t => Behavior t a -> Moment t (Event t (Future a)). Future jest abstrakcyjna i jest tylko jedna funkcja, która je konsumuje (reactimate').Dlaczego `zmiany` zwracają` Zdarzenie t (Przyszłość a) `

Mogę jednak łatwo napisać następującą funkcję:

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

dostać normalną (nie Future) wydarzenie.

Czy coś jest nie tak z tą funkcją? Jeśli nie, dlaczego oryginalna funkcja changes ma bardziej restrykcyjny typ?

Odpowiedz

4

Funkcja changes zwraca różne wartości niż opisana funkcja changes'. Kluczowym punktem jest następujący:

Rozważmy zachowania zdefiniowanego przez stepper (lub accumB), co zdarza się zmieniać w czasie t0. Jaką wartość ma zachowanie w tym momencie? Odpowiedź brzmi, że zachowanie przybiera nową wartość dla wszystkich czasów, które są ściśle większe niż czas zmiany, t> t0, i że nadal ma swoją starą wartość w czasie t0. Innymi słowy, funkcja changes' zwraca zdarzenie, którego wartościami są stare wartości Zachowania w momencie zmiany. Natomiast funkcja changes zwraca nowe ("przyszłe") wartości. Z różnych powodów, które mają związek z recursion, nowe wartości są zawijane w typie Future, więc nie można uzyskać do nich dostępu przed fazą reactimate'.

EDIT: Tobias opracowała obrazek na ilustracji:

+0

sens. Narysowałem [zdjęcie] (http://i.imgur.com/tVRDv2r.png) w celu zilustrowania. –

+0

Związany z tym z odpowiedzi. :-) –

Powiązane problemy