我想Behavior t a从 an创建一个IO a,其预期语义是每次行为为sampled 时都会运行 IO 操作:
{- language FlexibleContexts #-}
import Reflex.Dom
import Control.Monad.Trans
onDemand :: (MonadWidget t m, MonadIO (PullM t)) => IO a -> m (Behavior t a)
我希望我可以通过执行measurementin a来做到这一点pull:
onDemand measure = return $ pull (liftIO measure)
然而,结果Behavior在初始阶段后永远不会改变measure。
我能想出的解决方法是创建一个Behavior“足够频繁”更改的虚拟对象,然后创建一个虚假的依赖项:
import Data.Time.Clock as Time
hold_ :: (MonadHold t m, Reflex t) => Event t a -> m (Behavior t ())
hold_ = hold () . (() <$)
onDemand :: (MonadWidget t m, MonadIO (PullM t)) => IO a -> m (Behavior t a)
onDemand measure = do
now <- liftIO Time.getCurrentTime
tick <- hold_ =<< tickLossy (1/1200) now
return $ pull $ do
_ <- sample tick
liftIO measure
然后按预期工作;但由于Behaviors 无论如何只能按需采样,因此没有必要这样做。
创建一个Behavior连续的、随时可观察的现象的正确方法是什么?