考虑以下代码:
module Main where
import Control.Event.Handler
import Reactive.Banana
import Reactive.Banana.Frameworks
main :: IO ()
main = do
(addHandler, fire) <- newAddHandler
compile (network addHandler) >>= actuate
fire "fire one"
fire "fire two"
network :: AddHandler String -> MomentIO ()
network addHandler = do
fireEvent <- fromAddHandler addHandler
behavior <- stepper "initial stepper value" fireEvent
behaviorValue <- valueB behavior
reactimate $ putStrLn . (\v -> "fire input: " ++ show v) <$> fireEvent
reactimate $ print behaviorValue <$ fireEvent
该程序的输出为:
fire input: "fire one"
"initial stepper value"
fire input: "fire two"
"initial stepper value"
我是否正确使用
valueB
?如果没有,我在做什么错? valueB
的目的是什么?何时使用? 最佳答案
请记住,Moment
(和MomentIO
)单子表示在特定时间发生的计算。组合器valueB
只是简单地返回此时的Behavior值。就您而言,这只是一开始。
如果要在不同时间采样行为的值,则可以使用<@>
和<@
运算符,它们与<$>
和<$
非常相似。例如,将最后一行替换为
reactimate $ print <$> behavior <@ fireEvent
将在事件触发时的每时每刻打印行为的值。
更高级的用法是将
valueB
与execute
一起使用。