Ech*_*lan 7 haskell frp reactive-banana
我正在教自己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
我选择暂时不将此类功能包含在核心模型中,因为时间会给一致性带来各种挑战。例如,如果两个事件计划在 5 秒后发生,它们是否应该同时发生?如果不是,哪个应该放在第一位?我认为核心模型应该适合形式证明,但这不适用于实际的物理时间测量。
也就是说,我计划以“它们有效,但不能保证”的方式包含这些功能。我还没有这样做的主要原因是没有时间测量的规范选择。不同的应用程序有不同的需求,有时您想要纳秒分辨率,有时您想要使用 GUI 框架中的计时器,有时您想要同步到外部 MIDI 时钟。换句话说,您希望基于时间的函数能够与许多计时器实现一起工作,而只有在reactive-banana-0.7.0中我才找到了一个很好的API设计。
当然,已经可以通过使用定时器来实现您自己的基于时间的功能。Wave.hs示例演示了如何做到这一点。另一个例子是 Henning Thielemann 的reactive-balsa库,它实现了各种基于时间的组合器来实时处理MIDI数据。