Heinrich Apfelmus generously intervened in this problem . I considered using accumB as a solution, but thought there would be a type error. In any case, having tried his suggestion, I got a type error.
let bGameState :: Behavior t GameState bGameState = accumB initialGS $ updateGS <$ eInput yields the error Couldn't match expected type `GameState' with actual type `PlayerCommand' Expected type: GameState -> GameState Actual type: PlayerCommand -> GameState -> GameState In the first argument of `(<$)', namely `updateGS' In the second argument of `($)', namely `updateGS <$ eInput'
So, I learned (<$) and mixed up with a partial application. Looked at his examples. The more I did this, the more I thought that the code above should work, and I am confused why it does not.
This is what I think should happen:
since (<$) is of type (<$) :: a -> fb -> fa
and updateGS is of type updateGS :: PlayerCommand -> GameState -> GameState
and eInput is of type Event t PlayerCommand
then do not updateGS <$ eInput yield
Event t (GameState -> GameState) ?
My reasoning is spoiled somewhere, can someone indicate where?
Update: when I tried to use (<$>) , I got the following error:
outline.hs: 158: 21:
Could not deduce (t ~ t1) from the context (Frameworks t) bound by a type expected by the context: Frameworks t => Moment t () at outline.hs:(153,42)-(159,93) `t' is a rigid type variable bound by a type expected by the context: Frameworks t => Moment t () at outline.hs:153:42 `t1' is a rigid type variable bound by the type signature for bGameState :: Behavior t1 GameState at outline.hs:158:8 Expected type: Behavior t1 GameState Actual type: Behavior t GameState In the expression: accumB initialGS $ updateGS <$> eInput In an equation for `bGameState': bGameState = accumB initialGS $ updateGS <$> eInput
for reference, here is the whole function
makeNetworkDescription :: AddHandler PlayerCommand -> IO EventNetwork makeNetworkDescription addCommandEvent = compile $ do eInput <- fromAddHandler addCommandEvent let bCommand = stepper Null eInput eCommandChanged <- changes bCommand let bGameState :: Behavior t GameState bGameState = accumB initialGS $ updateGS <$> eInput reactimate $ (\n -> appendFile "output.txt" ("Command is " ++ show n)) <$> eCommandChanged