Haskell 在反应式计算机中处理当前时间 你如何处理当前的时间?
理想情况下,我希望有一个Haskell 在反应式计算机中处理当前时间 你如何处理当前的时间?,haskell,frp,reactive-banana,Haskell,Frp,Reactive Banana,理想情况下,我希望有一个行为,我可以通过“轮询”来获取当前时间。但是,使用事件轮询行为s(通过鉴于您的示例用例,我认为如果您远离轮询,应该没问题。为了解释原因,需要做一些澄清。(注:在下面的内容中,“流”指事件ta,以及“发生”)到组成它们的其中一个点火。) 但是,轮询行为与事件有关(通过啊,所以我现在应该有一个行为和一个完全独立的行为来处理蜱虫。这是有道理的,谢谢。虽然蜱虫不能带来当前时间本身,但似乎还是很遗憾,但也许我只是不知道导致FRP的微妙之处!@TomEllis在我的例子中是两个独立的
行为
,我可以通过“轮询”来获取当前时间。但是,使用事件轮询行为s(通过鉴于您的示例用例,我认为如果您远离轮询,应该没问题。为了解释原因,需要做一些澄清。(注:在下面的内容中,“流”指事件ta
,以及“发生”)到组成它们的其中一个点火。)
但是,轮询行为与事件有关(通过啊,所以我现在应该有一个行为
和一个完全独立的行为
来处理蜱虫。这是有道理的,谢谢。虽然蜱虫不能带来当前时间本身,但似乎还是很遗憾,但也许我只是不知道导致FRP的微妙之处!@TomEllis在我的例子中是两个独立的事件
s,但只有一个行为
,bTime
eTick
只是一个观察其他事物的工具;在域模型中没有与之相关联的可观察到的东西。如果你想把时间与刻度一起显示(在简单情况下,这可能是一个足够好的解决方案)最简单的方法是根本不使用行为
;例如,通过删除bTime
和etik
并直接使用eTime
(带有合适的勾号周期)。啊,是的,实际上我是想写两个独立的事件
而不是行为
s。
eIncrement = (+1) <$ eTick
bCount = accumB 0 eIncrement
eCountTick = bCount <@ eTick
eCountTock = bCount <@ eTock
{-# LANGUAGE RankNTypes #-}
module Main where
import Control.Concurrent
import Control.Monad
import Data.Time
import Reactive.Banana
import Reactive.Banana.Frameworks
main = do
let netDesc :: forall t. Frameworks t => Moment t ()
netDesc = do
(eTime, fireTime) <- newEvent
liftIO . forkIO . forever $
threadDelay (50 * 1000) >> getCurrentTime >>= fireTime
bTime <- flip stepper eTime <$> liftIO getCurrentTime
(eTick, fireTick) <- newEvent
liftIO . forkIO . forever $
threadDelay (5000 * 1000) >> fireTick ()
reactimate $ print <$> bTime <@ eTick
network <- compile netDesc
actuate network >> threadDelay (52000 * 1000) >> pause network