[Haskell-cafe] functions making their own memos

MarLinn monkleyon at gmail.com
Sun Jul 8 09:04:19 UTC 2018

> So this would generate a large circular movement:
> circularMovement :: MovementFunc
> This generates a small wobble.
> wobble :: MovementFunc
> Then I can compute the final position once per animation frame by
> superimposing or composing individual movements:
> computePosition :: [MovementFunc] -> Time -> IO Position

Is there any specific reason why you can't compute the wobbles all at 
once beforehand? I'm thinking something along the lines of FRP:

type Behaviour a  = Time -> a
type MovementFunc = Behaviour RelativeMovement

So you still have wobble :: MovementFunc, but MovementFunc is pure. And 
you combine them not with (.) but with (<*>):

mergeMovements :: [Behaviour RelativeMovement] -> Behaviour RelativeMovement
mergeMovements = (mconcat .) . sequenceA

computePosition :: [Behaviour RelativeMovement] -> Behaviour Position
computePosition movements time = moveBy (mergeMovements movements time) origin

Look, Ma, I'm still not using any IO! Wheeee!


More information about the Haskell-Cafe mailing list