【问题标题】:Do we care about the 'past' in FRP?我们关心 FRP 中的“过去”吗?
【发布时间】:2012-03-20 13:47:51
【问题描述】:

在尝试实施 FRP 时,我发现一件令人困惑的事情是: 与过去做些什么?基本上,我的理解是我可以在任何时候使用 Behavior 来做到这一点:

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

在这样的情况下,这似乎可能会给性能带来问题:

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

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

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

【问题讨论】:

  • 为什么这个标签是 Haskell 但使用的是 Scala 语法?毕竟,我认为这个问题与语言无关:-)

标签: haskell programming-languages functional-programming semantics frp


【解决方案1】:

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

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

当然,这会导致一个问题,即只能查看 exact 存在严重限制了您在编写函数来转换行为时可以做的事情:Behaviour a -&gt; Behaviour b 变得与 @ 相同987654324@,这让我们想做的很多事情都变得不可能。但这更多是寻找语义的问题,这是 FRP 的持久问题之一,而不是其他任何事情。只要您提供的对行为的原始转换足够强大而不会导致时间泄漏,一切都应该没问题。有关这方面的更多信息,请参阅Garbage collecting the semantics of FRP

【讨论】:

  • 明确一点:你的意思是我们应该只能在“现在”计算行为的价值吗?我觉得这很有意义,但我找不到 Conal 真正解释过这个......
  • 嗯,计算“在特定时间”的行为的价值是 FRP 系统本身没有涵盖的事情;它是一种将 FRP 系统与外界联系起来的方式。例如,在 Haskell 中,这样的函数可能是 value :: Behaviour a -&gt; IO a。但是抽象的FRP存在于一个没有IO的世界中:既然行为的定义是一个随时间变化的值,那么表示一个行为当前值的唯一方法就是……有一个行为!跨度>
  • 但是,就将 FRP 系统粘合到不纯的宿主语言而言,要么不提供接口来获取行为的值(你可能根本不需要它),要么只提供接口由于我在回答中概述的原因,目前获得价值似乎是最好的方式。我提供的 Conal 链接只是针对我在上一段中提到的语义问题;它不包含关于这个问题的任何建议。
  • 嗯,好的。我忘记了 Haskell 中的函数是纯粹的,这解释了为什么这些主题没有出现那么多。我正在开发一个 Scala FRP 框架,所以我想我会暂时删除 attransform(即在外部)。
猜你喜欢
  • 2014-07-02
  • 2018-01-12
  • 1970-01-01
  • 2012-08-11
  • 2021-12-03
  • 2019-12-06
  • 2019-09-08
  • 1970-01-01
  • 2016-11-24
相关资源
最近更新 更多