我在 Haskell 中使用 Reflex,并试图创建一个事件,该事件会在一段时间后触发(出于提问目的),比如说 2 秒。但是,每当原始事件触发时,计数器都应该重置,因此如果原始事件在 1 秒内触发两次,则第二个事件应该只有一次触发:在最后一个原始事件之后 2 秒。
我已经设法用
delayedReset :: MonadWidget t m => Event t () -> m (Event t ())
delayedReset ev = fmap (switch . current) . widgetHold (return never) $ timer <$ ev
where
timer = delay 2 =<< getPostBuild
但是使用 widgetHold 似乎有点过分;看来我们应该只需要一个 MonadHold 约束。有没有更惯用的方法来编写这个函数?