我仍然试图围绕 Haskell 和 FRP。具体来说,我已经使用 reactive-banana 包并开始获得 FRP 的一些例子。
但是,我仍然不明白事件网络何时知道输入事件的发生。我的理解是,与具有不断检查用户输入的事件循环的 NodeJS 不同,FRP 利用不同的框架来“等待”或“检查”用户输入或外部信号。
从我的阅读中,FRP 让时间明确。通过将时间与事件或行为联系起来,网络总是知道外部刺激何时被解雇。
我读过 Conal,Hudak 等人的许多论文。而且解释太技术化了。请提供较少的技术说明。
谢谢你的帮助。
1 回答
记住 FRP(与基本构建有趣的
Event
和Behavior
有关)和平台特定的“胶代码”之间的区别很有用,它提供了基本Event
的集合,如当前鼠标位置或键盘按键。在 Reactive-Banana 库中,这种区别反映在模块结构中,
Reactive.Banana.Combinators
与第一部分有关,而Reactive.Banana.Frameworks
与第二部分有关。现在,了解第二部分(基本
Events
)如何工作对于理解第一部分(FRP)如何工作并不重要;事实上,不同的库可能会做出非常不同的实现选择。也就是说,在 Reactive-Banana 库中,事件网络本质上是一个巨大的回调函数,它将自身注册到外部事件源(在库中称为
AddHandler
)。只要其中一个外部源调用回调函数,后者将按依赖顺序遍历Event
和Behavior
的图形,对内部状态执行必要的更新,最后运行先前使用reactimate
注册的操作。FRP 的神奇之处在于库用户没有看到任何这些实现细节,尽管知道“事件网络=一个巨大的回调函数”有时很有用。