当尝试实现FRP时,我发现令人困惑的一件事是
与过去有关系吗?基本上,我的理解是,我可以随时通过“行为”来做到这一点:
beh.at(x) // where time x < now
在以下情况下,这似乎是性能问题的明智之举:
val beh = Stepper(0, event) // stepwise behaviour
在这里,我们可以看到,要评估过去的行为,我们需要保留所有事件,并且每次采样时最终都会执行(最差的)线性扫描。
我们是否希望此功能可用,还是应该仅在> =现在的时间评估行为?我们是否还要向程序员公开
at
函数? 最佳答案
尽管行为被认为是时间的函数,但是依赖FRP中任意数量的过去数据是一件很糟糕的事情,被称为时间泄漏。也就是说,对行为的转换通常应该是流式的/反应式的,因为它们所依赖的不超过过去的有限量(并且应该明确地积累历史知识)。
因此,不,at
在实际的FRP系统中是不可取的:既不可能查看过去也不能查看将来。 (如果将来的状态取决于FRP系统外部的任何情况,那么后者当然是不可能的。)
当然,这会导致一个问题,即仅能查看确切的当前内容会严重限制您在编写用于转换行为的函数时可以执行的操作:Behaviour a -> Behaviour b
与a -> b
相同,这使得许多我们想做的事情变得不可能。但是,这比查找其他问题更重要的是查找语义,这是FRP的持久性问题之一。只要您提供的行为的原始转换足够强大而不会造成时间泄漏,一切都应该没问题。有关此的更多信息,请参见Garbage collecting the semantics of FRP。
关于haskell - 我们是否关心FRP中的 'past'?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9526836/