当我开始实施FRP时,我发现一件令人困惑的事情是什么 做过去吗?基本上,我的理解是我可以随时使用行为执行此操作:
beh.at(x) // where time x < now
在这样的情况下,这似乎可能是性能问题:
val beh = Stepper(0, event) // stepwise behaviour
在这里我们可以看到,为了评估过去的行为,我们需要保留所有事件,并且每次采样时我们最终都会执行(最坏的情况下)线性扫描。
我们是否希望此功能可用,或者是否只允许在一次&gt; =现在评估行为?我们甚至想要将at
函数公开给程序员吗?
答案 0 :(得分:20)
虽然行为被认为是时间的函数,但依赖于FRP中任意数量的过去数据是一件坏事,并且被称为时间泄漏。也就是说,对行为的转换通常应该是流式/反应性的,因为它们不依赖于过去的有限数量(并且应该积累历史明确的历史知识)。
所以,不,at
在实际的FRP系统中是不可取的:不应该看过去或未来。 (如果未来的状态取决于玻璃钢系统外部的任何东西,后者当然是不可能的。)
当然,这会导致只能查看 exact 的问题严重限制了在编写转换行为的函数时可以做的事情:Behaviour a -> Behaviour b
变得相同作为a -> b
,这使我们想做的许多事情变得不可能。但这更像是一个寻找语义的问题,这是FRP持久性问题之一,而不是其他任何问题;只要你提供的行为的原始转换足够强大而不会造成时间泄漏,一切都应该没问题。有关详细信息,请参阅Garbage collecting the semantics of FRP。