【发布时间】:2021-11-29 08:20:47
【问题描述】:
我得到了一个使用 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移动到末尾(使用 RecursiveDo 从 DOM 元素访问managerB),第一次按箭头键时的初始移动会滞后,并且帧以生涩的方式呈现。
我做错了吗?我应该以什么惯用方式来构建这些事件/行为?
此处的代码差异:https://github.com/brandonchinn178/snake/compare/inline-event-handlers
【问题讨论】:
标签: haskell frp threepenny-gui