Conal Elliott的论文将Event定义为
type Event a = [(T , a)] -- for non-decreasing times
这一次允许一个以上的事件发生。 我想在FRP库中实现该功能:
sample :: Reactive a -> Future () -> Future a
这将在将来触发时对反应堆进行采样。由于电抗在那时会具有多个值,我该如何实现呢?始终使用最后一个,第一个还是非空列表?
这是示例函数的行为:
sample
(MkReactive "a"
(MkEvent
(MkFuture 2
(MkReactive "b" ...)
)
)
(MkFuture 1 ())
= MkFuture 1 "a"
答案 0 :(得分:1)
在论文Push-pull functional reactive programming中(如果duplode是正确的),基本采样组合器switcher
被描述为:
bem`switcher` 的语义选择并采样b₀ 或给定采样时间 t
之前 e 的最后行为
sample
的行为应与该论文中的组合器兼容。由于Reactive
是具有初始值的Event
,而Future
是时间值对,因此sample r (MkFuture t ())
应该返回MkFuture t v
,其中{{1 }}是v
中严格从r
开始的最后一个值,或者t
的初始值(如果没有这样的值)。同时存在多个值没有问题:时间r
上的任何值都将被忽略,因为它们并非严格地位于t
之前,而在t
之前的值中,“取最后一个一个”是明确的。