我们关心玻璃钢中的"过去"吗?

sea*_*owg 20 haskell programming-languages functional-programming frp semantics

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

beh.at(x) // where time x < now
Run Code Online (Sandbox Code Playgroud)

在这样的情况下,这似乎可能是性能问题:

val beh = Stepper(0, event) // stepwise behaviour
Run Code Online (Sandbox Code Playgroud)

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

我们是否希望此功能可用,或者是否只允许在一次> =现在评估行为?我们甚至想把这个at函数暴露给程序员吗?

ehi*_*ird 20

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

所以,不,at在真正的FRP系统中是不可取的:不应该看过去或未来.(如果未来的状态取决于FRP系统外部的任何东西,那么后者当然是不可能的.)

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