【问题标题】:Blackheath's "Functional reactive programming" book, 2.6.3 section clarificationBlackheath 的《函数式反应式编程》一书,2.6.3 节说明
【发布时间】:2023-04-28 13:17:01
【问题描述】:

部分讲述了 FRP 流处理中的 merge 操作(使用Sodium library)。 Book 展示了下图的流组合,并说当事件通过流进入 FRP 逻辑时,会导致在事务上下文中发生的级联状态更改,因此所有更改都是原子的。

事件流 - sDeselectsSelect(参见 2 个事件:“+”和“-”)源自 UI 控件,因为它们发生在同一个 FRP 事务中,因此它们携带的事件被认为是同时发生的。然后书上说

merge 实现必须将事件存储在临时存储中 直到它知道它不会再收到任何输入。然后它 输出一个事件:如果它收到多个事件,它使用提供的 将它们结合起来的功能;否则,它会输出一个事件 收到了。

问题:什么时候是“不再有意见”的时候?合并函数如何知道这一刻?仅仅是它从给定图表上的第二个传入流中获取值的时间还是我错过了smth?你能用一个更好的流示例来说明它吗?

【问题讨论】:

    标签: functional-programming frp sodiumfrp


    【解决方案1】:

    Sodium 这样做的方式是为内存中保存的 FRP 逻辑的有向图结构分配等级编号,这样如果 B 依赖于 A,那么 B 的等级将高于 A 的等级。 (循环在分配这些等级的图遍历中被打破。)然后这些数字被用作优先级队列中的优先级,首先处理低等级值。

    在事件处理过程中,当优先级队列中没有任何内容低于合并的rank时,则知道合并不能再有输入数据了,就会输出一个值。

    【讨论】: