Blackheath 的 "Functional reactive programming" 书,第 2.6.3 节说明
Blackheath's "Functional reactive programming" book, 2.6.3 section clarification
部分谈到 FRP 流处理中的 merge 操作(使用 Sodium library)。书中显示了流组合的下图,并说当事件通过流进入 FRP 逻辑时,它会导致事务上下文中发生的级联状态更改,因此所有更改都是原子的。
事件流 - sDeselect
、sSelect
(查看 2 个事件:“+”和“-”)源自 UI 控件,因为它们发生在同一 FRP 中transaction 他们携带的事件被认为是同时发生的。然后书上说
The merge implementation has to store the events in temporary storage
until a time when it knows it won’t receive any more input. Then it
outputs an event: if it received more than one, it uses the supplied
function to combine them; otherwise, it outputs the one event it
received.
问题:什么时候是"no more input will come"?合并功能如何知道这一刻?它只是从给定图表上的第二个传入流中获取值的时间,还是我遗漏了 smth?你能用一个更好的流例子来说明吗?
Sodium 这样做的方式是为保存在内存中的 FRP 逻辑的有向图结构分配等级编号,这样如果 B 依赖于 A,那么 B 的等级将高于 A。 (在分配这些等级的图形遍历中循环被打破。)然后将这些数字用作优先级队列中的优先级,首先处理低等级值。
在事件处理过程中,当优先级队列中没有低于merge的rank时,就知道不能再有merge的输入数据了,就会输出一个值。
部分谈到 FRP 流处理中的 merge 操作(使用 Sodium library)。书中显示了流组合的下图,并说当事件通过流进入 FRP 逻辑时,它会导致事务上下文中发生的级联状态更改,因此所有更改都是原子的。
事件流 - sDeselect
、sSelect
(查看 2 个事件:“+”和“-”)源自 UI 控件,因为它们发生在同一 FRP 中transaction 他们携带的事件被认为是同时发生的。然后书上说
The merge implementation has to store the events in temporary storage until a time when it knows it won’t receive any more input. Then it outputs an event: if it received more than one, it uses the supplied function to combine them; otherwise, it outputs the one event it received.
问题:什么时候是"no more input will come"?合并功能如何知道这一刻?它只是从给定图表上的第二个传入流中获取值的时间,还是我遗漏了 smth?你能用一个更好的流例子来说明吗?
Sodium 这样做的方式是为保存在内存中的 FRP 逻辑的有向图结构分配等级编号,这样如果 B 依赖于 A,那么 B 的等级将高于 A。 (在分配这些等级的图形遍历中循环被打破。)然后将这些数字用作优先级队列中的优先级,首先处理低等级值。
在事件处理过程中,当优先级队列中没有低于merge的rank时,就知道不能再有merge的输入数据了,就会输出一个值。