在FRP中实现快照

sea*_*owg 6 haskell programming-languages scala frp semantics

我在Scala中实现了一个FRP框架,我似乎遇到了一个问题.在一些思考的启发下,这个问题我决定限制我的框架的公共接口,所以行为只能在'现在'中进行评估,即:

behaviour.at(now) 
Run Code Online (Sandbox Code Playgroud)

这也符合Conal在Fran论文中的假设,即行为只会在不断增加的时间进行评估/抽样.它确实限制了行为的转换,但是我们发现自己遇到了代表一些输入的行为的巨大问题:

val slider = Stepper(0, sliderChangeEvent) 
Run Code Online (Sandbox Code Playgroud)

使用此行为,评估未来值将是不正确的,并且评估过去的值将需要无限量的内存(必须存储"slider"事件中使用的所有事件).

鉴于此限制,我在行为上的"快照"操作规范方面遇到了问题.我的问题最好用一个例子解释(使用上面提到的滑块):

val event = mouseB // an event that occurs when the mouse is pressed 
val sampler = slider.snapshot(event) 
val stepper = Stepper(0, sampler) 
Run Code Online (Sandbox Code Playgroud)

我的问题是,如果执行此代码时发生'mouseB'事件,那么'stepper'的当前值将是'slider'的最后一个'样本'(最后一次出现时的值).如果最后一次出现的时间是过去那么我们将最终使用过去的时间来评估"滑块",该时间打破了上面的规则集(以及您的原始假设).我可以看到几种解决方法:

  1. 我们"记录"过去(保持事件中所有过去的事件),允许用过去时间评估行为(使用无限量的内存)
  2. 我们修改'snapshot'以获取时间参数("此时间之后的样本")并强制执行该时间> = now
  3. 在一个更古怪的举动中,我们可以以某种方式将FRP对象的创建限制为程序的初始设置,并且仅在此设置完成后才开始处理事件/输入

我也可以简单地不实现'sample'或删除'stepper'/'switcher'(但我真的不想做这些事情中的任何一个).有没有人对此有任何想法?我在这里误解了什么吗?

luq*_*qui 3

哦,我现在明白你的意思了。

我认为你的“你只能在‘现在’采样”的限制不够严格。它需要更强一点,以避免回顾过去。由于您使用的是 的环境概念now,我将根据它来定义行为构造函数(只要now不能仅通过定义的执行来推进,根据我的最后一个答案,这会变得混乱)。例如:

Stepper(i,e)i是具有间隔内值的行为[now,e1](其中是aftere1第一次出现的时间),以及 after 最新出现的值。enowe

有了这个语义,你对让你陷入这个难题的值的预测stepper就被消除了,步进器现在的值为 0。我不知道这个语义是否适合你,但对我来说似乎很自然。