我正在Scala中实现一个FRP框架,似乎遇到了问题。出于某种思考的动机,我决定限制框架的公共接口,使得Behaviours只能在“present”时被评估,即:
我的问题在于,如果在执行此代码时发生了'mouseB'事件,那么'stepper'的当前值将是'slider'的最后一个'sample'(即上次事件发生时的值)。如果上次事件发生的时间已经过去,那么我们将会使用过去的时间来评估'slider',这将违反上述规则(和你最初的假设)。我可以想到几种解决方法:
behaviour.at(now)
这也符合Conal在Fran论文中的假设,即Behaviours只会在递增的时间点进行评估/采样。这确实限制了对Behaviours的变换,但否则我们会在代表某些输入的Behaviours方面遇到巨大问题:
val slider = Stepper(0, sliderChangeEvent)
使用这种行为,评估未来值将是不正确的,并且评估过去的值需要一个无限数量的内存(所有在“slider”事件中使用的出现都必须被存储)。
考虑到这个限制,我对 Behaviours 的 'snapshot' 操作规范有困难。我最好通过一个示例来解释我的问题(使用上面提到的滑块):
val event = mouseB // an event that occurs when the mouse is pressed
val sampler = slider.snapshot(event)
val stepper = Stepper(0, sampler)
我的问题在于,如果在执行此代码时发生了'mouseB'事件,那么'stepper'的当前值将是'slider'的最后一个'sample'(即上次事件发生时的值)。如果上次事件发生的时间已经过去,那么我们将会使用过去的时间来评估'slider',这将违反上述规则(和你最初的假设)。我可以想到几种解决方法:
- 记录过去的值(保留所有事件的过去值),允许使用过去的时间评估行为(需要无限制的内存)
- 修改'snapshot'函数,增加一个时间参数(“在此时间之后采样”),并强制要求该时间大于等于现在
- 更疯狂的做法是,我们可以以某种方式限制FRP对象的创建只能在程序的初始设置中完成,并且只有在此设置完成后才开始处理事件/输入。