gpt4 book ai didi

haskell - 反射:创建可重置的延迟事件

转载 作者:行者123 更新时间:2023-12-02 07:52:59 26 4
gpt4 key购买 nike

我在 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 约束。有没有更惯用的方法来编写这个函数?

最佳答案

看来我错过了相当明显的:

delayedReset :: MonadWidget t m => Event t () -> m (Event t ())
delayedReset ev = do
endEv <- delay 2 ev
countDyn <- foldDyn ($) (0 :: Int) $ leftmost
[ (+1) <$ ev, subtract 1 <$ endEv ]
return $ attachPromptlyDynWithMaybe ifZero countDyn endEv
where
ifZero 0 a = Just a
ifZero _ _ = Nothing

可以放宽限制,但这会使它们变得更加冗长。

最终,我选择了第一个解决方案。我认为性能影响很小,并且它简化了程序的其他一些方面。

关于haskell - 反射:创建可重置的延迟事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48392106/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com