7

我正在自学 FRP 和 Reactive-banana,同时编写我希望对跟随我的人更有用的教程。你可以在这里查看我的教程进度。

我一直在尝试使用事件来实现简单的哔哔声示例。我知道我需要做这样的事情:

reactimate $ fmap (uncurry playNote) myEvent

在我的NetworkDescription,但我不知道如何让网络重复做同样的事情,或者做一次。理想情况下,我正在寻找这样的东西:

once :: a -> Event t a
repeatWithDelay :: Event t a -> Time -> Event t a
concatWithDelay :: Event t a -> Event t a -> Time -> Event t a

上面的Time类型只是我们最终使用的任何时间测量的替代品。我是否需要将系统时间作为行为来驱动“延迟”功能?这似乎比必要的复杂。

提前致谢,

回声诺兰

编辑:好的,repeatWithDelay 和 concatWithDelay 的类型没有意义。这就是我真正的意思。

repeatWithDelay :: a -> Time -> Event t a
concatWithDelay :: a -> a -> Time -> Event t a
4

1 回答 1

4

我暂时选择不在核心模型中包含这些功能,因为时间对一致性提出了各种挑战。例如,如果两个事件计划在 5 秒后发生,它们应该同时发生吗?如果不是,应该先来哪一个?我认为核心模型应该可以得到正式证明,但这不适用于实际的物理时间测量。

也就是说,我计划以“它们有效,但不能保证”的方式包含这些功能。我还没有这样做的主要原因是时间测量没有规范的选择。不同的应用程序有不同的需求,有时您想要纳秒级分辨率,有时您想要使用 GUI 框架中的计时器,有时您想要同步到外部 MIDI 时钟。换句话说,您希望基于时间的函数能够与许多计时器实现通用地工作,并且只有在 reactive-banana-0.7.0 的情况下,我才找到了一个很好的 API 设计。

当然,已经可以通过使用定时器来实现自己的基于时间的功能。Wave.hs示例演示了如何做到这一点另一个例子是 Henning Thielemann 的reactive-balsa 库,它实现了各种基于时间的组合器来实时处理 MIDI 数据。

于 2012-09-21T08:57:19.703 回答