【发布时间】:2013-11-27 02:04:57
【问题描述】:
所以我试图了解 Sodium 的函数式反应式编程模型是如何工作的,但我遇到了一些障碍。 我有一个数字列表,我正在使用类似“时间”的值进行更新,并且当传入空格字符时,我将添加到此列表中。 运行它的引擎如下。
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 会被注入到列表中。
实际上,每次按下 enter 时,我希望列表中的所有数字都增加一。
相反,只有在我按下空格后,数字才会增加。
有谁知道我哪里出错了?
【问题讨论】: