考虑以下代码:

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


将在事件触发时的每时每刻打印行为的值。

更高级的用法是将valueBexecute一起使用。

09-17 06:53