我已经使用
据我所知,第二种方法更符合FRP的惯用法,因为它使用实际事件定义行为,而不是创建代理事件来进行更新。但是当我进行此更改时,会出现以下两个问题之一:
代码差异在这里:https://github.com/brandonchinn178/snake/compare/inline-event-handlers
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'
据我所知,第二种方法更符合FRP的惯用法,因为它使用实际事件定义行为,而不是创建代理事件来进行更新。但是当我进行此更改时,会出现以下两个问题之一:
- 如果我首先定义
managerB
(使用RecursiveDo访问下面定义的timer
),则根本不会呈现任何内容。 - 如果我将
managerB
移到最后(使用RecursiveDo从DOM元素访问managerB
),则第一次按箭头键时的初始移动会延迟,并且帧以颤抖的方式呈现。
代码差异在这里:https://github.com/brandonchinn178/snake/compare/inline-event-handlers