Я хотел бы создать Behavior t a
из IO a
, с предполагаемой семантикой, что действие IO будет запускаться каждый раз, когда поведение sample
d:Создания поведения для непрерывного измеримого явления
{- language FlexibleContexts #-}
import Reflex.Dom
import Control.Monad.Trans
onDemand :: (MonadWidget t m, MonadIO (PullM t)) => IO a -> m (Behavior t a)
Я надеялся Я мог бы сделать это, просто выполняя measurement
в 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
для непрерывного, наблюдаемого в любое время явления?
Я не знаю, как делать то, что вы хотите, но я буду наблюдать, что то, что вы просите, семантически очень странно - «смысл» такого поведения может измениться в зависимости от того, как наблюдатели взаимодействовали с поведением. Я не знаю, что ваша структура FRP достаточно, чтобы точно знать, но я ожидал бы, что поведение должно быть независимым от наблюдения - и тот факт, что наблюдение может изменить то, как «значение» вычисляется во время выполнения, является просто детальностью реализации а не что-то, что предназначено для работы с программистом. –
Это что-то вроде «Сигнала» в Вязе, которого вы пытаетесь достичь? – zakyggaps