【发布时间】:2013-11-09 05:46:42
【问题描述】:
我已经搜索了reactive-banana 的文档,但找不到指定明确时间延迟的方法。比如说,我想取一个Event t a 并将其所有出现的时间移到未来 1 秒;或获取一个从现在开始 1 秒后触发的事件(在 Moment t 内);或类似的东西。反应性香蕉中是否可以表示显式延迟?如果不是,用户如何实现,例如延迟一秒回显输入?
【问题讨论】:
标签: haskell frp reactive-banana
我已经搜索了reactive-banana 的文档,但找不到指定明确时间延迟的方法。比如说,我想取一个Event t a 并将其所有出现的时间移到未来 1 秒;或获取一个从现在开始 1 秒后触发的事件(在 Moment t 内);或类似的东西。反应性香蕉中是否可以表示显式延迟?如果不是,用户如何实现,例如延迟一秒回显输入?
【问题讨论】:
标签: haskell frp reactive-banana
正如 Ben 所说,这是正确的:reactive-banana 没有内置的时间和延迟概念。
主要原因是很难保证逻辑时间和实时时间一致。如果鼠标点击实时发生在尚未计算的事件的逻辑时间之前,即其实时时间落后于其逻辑时间,会发生什么情况?
但是,仍然可以使用外部计时器事件来处理时间。查看Wave.hs 示例。
【讨论】:
无论如何我都不是专家,但我已经使用了一个较旧的响应式香蕉来满足这种需求(不幸的是,我目前手头没有代码)。
我认为显式延迟不适合超自然地在响应式香蕉框架中,因为您总是在隐式处理某种抽象时间。延迟特定的时间间隔需要处理现实世界的时间概念。我可以看到,很难说像union event (delay 1.0 event) 这样的东西在type Event a = [Maybe a] 的权威模型中意味着什么:应该是[a, b, a, b] 还是[a, a, b, b]?正如我一直在考虑的那样,问题是在不考虑操作运行时细节的情况下,这两个结果中的哪一个是未指定的。
但是您可以通过将 IO 操作连接到您想要延迟的事件(显然不是在主线程中)然后触发不同的事件,从而“围绕”响应式香蕉框架来执行此操作。我相信我能够将所有逻辑封装在一个函数中,我可以从 NetworkDescription monad 调用(这是在 Moment monad 存在之前)来获取我的新延迟事件。
【讨论】: