20

在玩弄实施 FRP 时,我发现令人困惑的一件事是如何处理过去?基本上,我的理解是我可以在任何时候使用 Behavior 来做到这一点:

beh.at(x) // where time x < now

在这样的情况下,这似乎在性能方面可能会出现问题:

val beh = Stepper(0, event) // stepwise behaviour

在这里我们可以看到,要评估过去的行为,我们需要保留所有事件,并且每次采样时我们最终都会执行(最坏的情况下)线性扫描。

我们是否希望这种能力可用,或者应该只允许一次评估行为 >= 现在?我们甚至想将at函数公开给程序员吗?

4

1 回答 1

20

虽然行为被认为是时间的函数,但依赖 FRP 中任意数量的过去数据是一件坏事,被称为时间泄漏。也就是说,行为的转换通常应该是流式/反应式的,因为它们不依赖于超过有限数量的过去(并且应该明确地积累这种历史知识)。

所以,不,at在真正的 FRP 系统中是不可取的:既不能看到过去也不能看到未来。(如果未来的状态取决于 FRP 系统之外的任何东西,后者当然是不可能的。)

当然,这导致了一个问题,即只能看到确切的现在严重限制了您在编写转换行为的函数时可以做的事情:Behaviour a -> Behaviour b变得与 相同a -> b,这使得我们想做的许多事情变得不可能。但这更多是寻找语义的问题,这是 FRP 的持久问题之一,而不是其他任何事情。只要您提供的对行为的原始转换足够强大而不会导致时间泄漏,一切都应该没问题。有关这方面的更多信息,请参阅垃圾收集 FRP 的语义

于 2012-03-02T02:03:39.950 回答