我得到了一个与该threepenny-gui
库一起工作的蛇版本,但我不喜欢我明确地手动调用newEvent
而addStateUpdate
不是完全基于事件定义行为的事实,例如:
(updates, addUpdate) <- liftIO newEvent
managerB <- accumB initialManager updates
on UI.tick timer $ \_ -> addUpdate $ \manager -> manager'
相比:
managerB <- accumB initialManager $
UI.tick timer $> \manager -> manager'
IIUC 第二个是更惯用的 FRP,因为它定义了实际事件的行为,而不是创建代理事件来代理更新。但是,当我进行此更改时,它会导致以下两个问题之一:
- 如果我
managerB
先定义(使用 RecursiveDo 访问timer
,定义如下),则根本没有渲染 - 如果我移动
managerB
到最后(使用 RecursiveDomanagerB
从 DOM 元素访问),第一次按下箭头键时的初始移动会滞后,并且帧以生涩的方式呈现。
难道我做错了什么?我应该以什么惯用方式构建这些事件/行为?
此处的代码差异:https ://github.com/brandonchinn178/snake/compare/inline-event-handlers