Heinrich Apfelmus generously chimed in on this problem. I had considered using accumB
as a solution, but thought there would be a type error. After trying his suggestion anyway, I did recieve 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 studied (<$)
, and messed around with partial application. Looked at his suggested examples. The more I did this, the more I thought the above code should work, and I am baffled as to why it doesn't.
This is what I think should be happening:
since (<$)
is of type (<$) :: a -> f b -> f a
and updateGS is of type updateGS :: PlayerCommand -> GameState -> GameState
and eInput
is of type Event t PlayerCommand
then should not updateGS <$ eInput
yield
Event t (GameState -> GameState)
?
My reasoning is flawed somewhere, could someone point out where?
Update: when I tried using (<$>)
I recieved 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