en cuenta que
mapAccum :: acc -> Event t (acc -> (x, acc)) -> (Event t x, Behavior t acc)
por lo que toma un valor inicial :: acc
a acumularse en, y un suceso que produce una función que actualizaciones que se acumularon valor, mientras que la producción de un valor de salida ::x
. (Por lo general, haría un evento de este tipo aplicando parcialmente alguna función a través de <$>
.) Como resultado, obtiene un nuevo Evento que dispara sus valores x
cada vez que aparecen y un Comportamiento que contiene su valor acumulado actual.
Uso mapAccum
si tiene un evento y desea realizar una conducta relacionada y evento.
Por ejemplo, en el dominio del problema de your other question, suponga que tiene un evento eTime :: Event t Int
que disparó de manera irregular y que quería calcular eDeltaTime :: Event t Int
de las diferencias y bTimeAgain :: Behaviour t Int
por el tiempo utilizado actualmente:
type Time = Int
type DeltaTime = Time
getDelta :: Time -> Time -> (DeltaTime,Time)
getDelta new old = (new-old,new)
que podría tener escrito que getDelta new = \old -> (new-old,new)
para hacer más claro el siguiente paso:
deltaMaker :: Event t (Time -> (DeltaTime,Time))
deltaMaker = getDelta <$> eTime
(eDeltaT,bTimeAgain) = mapAccum 0 $ deltaMaker
En este caso, habría bTimeAgain
b e un comportamiento con el mismo valor que los eventos en eTime
. Esto sucede porque mi función getDelta
pasa new
directamente sin cambios desde eTime
al valor acc
. (Si quería bTimeAgain
por sí solo, habría utilizado stepper :: a -> Event t a -> Behaviour t a
.) Si no necesito bTimeAgain
, sólo podría escribir (eDeltaT,_) = mapAccum 0 $ deltaMaker
.
Tres comentarios, 1) Creo que es genial que el usted, el autor, están aquí respondiendo a las preguntas. 2) La notación gratuita de puntos es difícil de leer si no está seguro de lo que hace la función porque no hay nombres. 3) Donde me perdí fue entendiendo que el 'acc' dado a la función en el evento de entrada era un buen lugar para almacenar el historial de eventos. Seguí tratando de poner el valor que estaba tratando de encontrar allí, cuando debería haber ido en la parte 'x'. –