Notez que
mapAccum :: acc -> Event t (acc -> (x, acc)) -> (Event t x, Behavior t acc)
il prend une valeur initiale :: acc
à accumuler sur, et un événement qui produit une fonction qui mises à jour valeur accumulée tout en produisant une valeur de sortie ::x
. (En général, vous pouvez faire un tel événement en appliquant partiellement une fonction via <$>
.) En conséquence, vous obtenez un nouvel événement qui déclenche vos valeurs x
chaque fois qu'ils apparaissent et un comportement contenant votre valeur accumulée actuelle.
Utilisez mapAccum
si vous avez un événement et que vous souhaitez y faire un comportement et un événement.
Par exemple, dans votre domaine de problème your other question, supposons que vous avez un événement eTime :: Event t Int
qui a tiré de façon erratique et que vous vouliez calculer eDeltaTime :: Event t Int
les différences et bTimeAgain :: Behaviour t Int
pour le moment utilisé actuellement:
type Time = Int
type DeltaTime = Time
getDelta :: Time -> Time -> (DeltaTime,Time)
getDelta new old = (new-old,new)
Je pourrais avoir écrit que getDelta new = \old -> (new-old,new)
pour faire l'étape suivante plus claire:
deltaMaker :: Event t (Time -> (DeltaTime,Time))
deltaMaker = getDelta <$> eTime
(eDeltaT,bTimeAgain) = mapAccum 0 $ deltaMaker
Dans ce cas, bTimeAgain
serait b e un comportement ayant la même valeur que les événements dans eTime
. Cela se produit parce que ma fonction getDelta
passe new
directement inchangé de eTime
à la valeur acc
. (Si je voulais bTimeAgain
seul, j'aurais utilisé stepper :: a -> Event t a -> Behaviour t a
.) Si je n'ai pas besoin de bTimeAgain
, je pourrais juste écrire (eDeltaT,_) = mapAccum 0 $ deltaMaker
.
Trois commentaires, 1) Je pense qu'il est grand que vous, l'auteur, sont ici répondre à des questions. 2) La notation sans points est difficile à lire si vous n'êtes pas sûr de ce que fait la fonction parce qu'il n'y a pas de noms. 3) Je me suis perdu en comprenant que le 'acc' donné à la fonction dans l'événement d'entrée était un bon endroit pour stocker l'histoire des événements. J'ai continué à essayer de mettre la valeur que j'essayais de trouver à la place, alors que cela aurait dû aller dans la partie «x». –