【发布时间】:2023-08-30 15:09:01
【问题描述】:
我正在 Scala 中实现 FRP 框架,但我似乎遇到了问题。出于某种想法,这个问题我决定限制我的框架的公共接口,因此只能在“现在”中评估行为,即:
behaviour.at(now)
这也符合 Conal 在 Fran 论文中的假设,即仅在增加的时间对行为进行评估/采样。它确实限制了 Behaviors 的转换,但除此之外,我们发现自己在表示某些输入的 Behaviors 方面存在巨大问题:
val slider = Stepper(0, sliderChangeEvent)
使用此行为,评估未来值将是不正确的,评估过去值将需要无限量的内存(必须存储“滑块”事件中使用的所有事件)。
鉴于此限制,我在对行为的“快照”操作规范方面遇到问题。我的问题最好用一个例子来解释(使用上面提到的滑块):
val event = mouseB // an event that occurs when the mouse is pressed
val sampler = slider.snapshot(event)
val stepper = Stepper(0, sampler)
我的问题是,如果在执行此代码时发生了“mouseB”事件,那么“步进器”的当前值将是“滑块”的最后一个“样本”(最后一次发生时的值) )。如果最后一次发生的时间是过去,那么我们最终将使用过去的时间评估“滑块”,这违反了上面的规则集(以及您的原始假设)。我可以看到几种方法来解决这个问题:
- 我们“记录”过去(在事件中保留所有过去发生的事件)允许评估过去时间的行为(使用无限量的内存)
- 我们修改“快照”以采用时间参数(“此时间后的样本”)并强制该时间 >= 现在
- 在一个更古怪的举动中,我们可以以某种方式将 FRP 对象的创建限制为程序的初始设置,并且仅在此设置完成后才开始处理事件/输入
我也可以简单地不实现“sample”或删除“stepper”/“switcher”(但我真的不想做这两件事)。有人对此有任何想法吗?我在这里误解了什么吗?
【问题讨论】:
-
你知道Reactive,不是吗?
-
Reactive 很酷,但它打破了 FRP 中的一些想法。例如,它没有连续行为的概念:反应中的信号在不同值之间随时间离散地变化。我最初很困惑这如何适合 FRP,并在不久前问了这个问题:*.com/questions/7451317/…
-
另外,据我所知,Reactive 实际上并没有任何像“快照”这样的功能。
标签: scala haskell programming-languages semantics frp