scala - 在 FRP 中实现快照

标签 scala haskell programming-languages semantics frp

我正在 Scala 中实现 FRP 框架,我似乎遇到了问题。出于某种想法,这个问题我决定限制我的框架的公共(public)接口(interface),以便只能在“现在”中评估行为,即:

behaviour.at(now) 

这也符合 Conal 在 Fran 论文中的假设,即仅在增加的时间对行为进行评估/采样。它确实限制了 Behaviors 的转换,但除此之外,我们发现自己在表示某些输入的 Behaviors 方面存在巨大问题:
val slider = Stepper(0, sliderChangeEvent) 

使用此行为,评估 future 值将是不正确的,评估过去值将需要无限量的内存(必须存储“ slider ”事件中使用的所有事件)。

鉴于此限制,我对行为的“快照”操作规范有疑问。我的问题最好用一个例子来解释(使用上面提到的 slider ):
val event = mouseB // an event that occurs when the mouse is pressed 
val sampler = slider.snapshot(event) 
val stepper = Stepper(0, sampler) 

我的问题是,如果在执行此代码时发生了“mouseB”事件,那么“步进器”的当前值将是“ slider ”的最后一个“样本”(最后一次发生时的值)。如果最后一次发生的时间是过去,那么我们最终将使用过去的时间来评估“ slider ”,这违反了上面的规则集(以及您最初的假设)。我可以看到几种解决此问题的方法:
  • 我们“记录”过去(在事件中保留所有过去发生的事件)允许评估过去时间的行为(使用无限量的内存)
  • 我们修改 'snapshot' 以采用时间参数(“此时间后的样本”)并强制该时间 >= now
  • 在一个更古怪的举动中,我们可以以某种方式将 FRP 对象的创建限制为程序的初始设置,并且仅在此设置完成后才开始处理事件/输入

  • 我也可以简单地不实现'sample'或删除'stepper'/'switcher'(但我真的不想做这两件事)。有人对此有任何想法吗?我在这里误解了什么吗?

    最佳答案

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

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

    Stepper(i,e) is a behavior with the value i in the interval [now,e1] (where e1 is the time of first occurrence of e after now), and the value of the most recent occurrence of e afterward.



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

    关于scala - 在 FRP 中实现快照,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9626437/

    相关文章:

    scala - SBT:在不发布的情况下依赖其他 SBT 项目

    scala - 为什么类 val 参数不能按名称调用?

    haskell - 实例声明中类型变量的顺序

    haskell - 如何在Haskell中实现++?

    java - 重新学习语言的最佳方法是什么?

    programming-languages - 异常(exception)最早出现在哪种语言中?

    java - 如何存储Java中方法返回的数组

    scala - 如何使用 scalaz 中的序列将 T[G[A]] 转换为 G[T[A]]

    scala - 我应该更喜欢 Scala 中的密封类还是枚举?

    haskell - Haskell 类型类 'Real' 是用词不当吗?