我正在自学FRP和Reactive-banana,同时也在写一篇我希望对那些关注我的人更有用的教程。您可以在tutorial here上查看我的进度。
我一直在尝试使用事件来实现简单的蜂鸣噪声示例。我知道我需要这样做:
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类型只是我们最终使用的任何时间度量的替身。我是否需要将系统时间作为一种行为来驱动“延迟”函数?这似乎比必要的更复杂。
提前谢谢你,
Echo Nolan
编辑:好的,repeatWithDelay和concatWithDelay的类型没有意义。这就是我的实际意思。
repeatWithDelay :: a -> Time -> Event t a
concatWithDelay :: a -> a -> Time -> Event t a发布于 2012-09-21 16:57:20
我选择现在不在核心模型中包含这样的函数,因为时间对一致性提出了各种挑战。例如,如果计划从现在起5秒后发生两个事件,它们是否应该同时发生?如果没有,哪一个应该放在第一位?我认为核心模型应该服从正式的证明,但这不适用于实际的物理时间测量。
也就是说,我计划以一种“它们可以工作,但不能保证”的方式包含这些函数。我还没有这样做的主要原因是没有标准的时间度量选择。不同的应用程序有不同的需求,有时您需要纳秒精度,有时您希望使用GUI框架中的计时器,有时您希望与外部MIDI时钟同步。换句话说,您希望基于时间的函数能够与许多计时器实现一起使用,并且只有在使用reactive banana-0.7.0时,我才发现了一个很好的API设计。
当然,已经可以通过使用计时器来实现您自己的基于时间的函数。Wave.hs示例演示了如何做到这一点。另一个例子是Henning Thielemann的reactive-balsa library,它实现了各种基于时间的组合器来实时处理MIDI数据。
https://stackoverflow.com/questions/12520242
复制相似问题