我想Behavior t a
从 an创建一个IO a
,其预期语义是每次行为为sample
d 时都会运行 IO 操作:
{- language FlexibleContexts #-}
import Reflex.Dom
import Control.Monad.Trans
onDemand :: (MonadWidget t m, MonadIO (PullM t)) => IO a -> m (Behavior t a)
我希望我可以通过执行measurement
in 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
然后按预期工作;但由于Behavior
s 无论如何只能按需采样,因此没有必要这样做。
创建一个Behavior
连续的、随时可观察的现象的正确方法是什么?