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