Итак, я пытаюсь понять, как работает модель натрия для функционального реактивного программирования, и я сталкиваюсь с некоторыми корягами. У меня есть список чисел, которые я обновляю с помощью значения «Время», и я добавляю в этот список, когда передаются пробельные символы. Двигатель, который запускает это, выглядит следующим образом.Изменения на натриевые события не отражаются
import FRP.Sodium
type Time = Event Int
type Key = Event Char
type Game a = Time -> Key -> Reactive (Behavior a)
run :: Show a => Game a -> IO()
run game = do
(dtEv, dtSink) <- sync newEvent
(keyEv, keySink) <- sync newEvent
g <- sync $ do
game' <- game dtEv keyEv
return game'
go g dtSink keySink
return()
where
go gameB dtSink keySink = do
sync $ dtSink 1
ks <- getLine
mapM_ (sync . keySink) ks
v <- sync $ sample gameB
print v
go gameB dtSink keySink
Таким образом, я печатаю текущее значение, поведение игры дает каждый «тик». Вот код поведения игры.
main :: IO()
main = run game
game :: Time -> Key -> Reactive (Behavior [Int])
game dt key = do
let spawn = const 0 <$> filterE (==' ') key
rec
bs <- hold [] $ snapshotWith (\s xs -> (s:xs)) spawn updated
updated <- hold [] $ snapshotWith (\t xs -> map (+t) xs) dt bs
return updated
Что я ожидал бы это сделать, это с каждым символом пробела, введенным, 0
получает впрыскивается в список. Эффективно, каждый раз, когда вводится нажатие, я ожидаю, что все числа в списке будут увеличиваться на единицу. Вместо этого числа увеличиваются только после того, как я нажимаю пробел. Кто-нибудь знает, где я ошибаюсь?