Haskell valueB如何工作?它总是返回相同的值?
考虑以下代码:Haskell valueB如何工作?它总是返回相同的值?,haskell,reactive-programming,frp,reactive-banana,Haskell,Reactive Programming,Frp,Reactive Banana,考虑以下代码: 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" fi
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
我是否正确使用了
valueB
?如果没有,我做错了什么?valueB
的用途是什么?我应该在什么时候使用它?根据文档,valueB
获取给定行为的当前值。它在某些单子时刻起作用。在这种情况下,这个“时刻”是网络创建的时间。由于这个原因,您总是得到相同的值。在开始时,您只要求一次该值
你不能直接对行为的变化做出反应,因为它们不会真正通知你它们的变化(它们是连续的信号)
如果您想查看valueB
的操作。我认为execute
功能正是您所需要的
execute (valueB <$> stepper "initial stepper value" fireEvent)
execute(valueB步进器“初始步进器值”事件)
这当然是一个非常做作的例子,但它应该做你想要的
另外,我没有专门使用ReactiveBanana的经验,但大多数FRP框架的工作方式都类似。请记住,时刻
(和时刻
)monad表示在特定时刻发生的计算。组合器valueB
只返回此时行为的值。对你来说,这只是一个开始
如果您想在不同的时间对某个行为的值进行采样,您可以使用
和我最终意识到valueB
出于某种原因出现在文档的“高阶”部分,它可能最常与其他高阶操作一起出现,如switchB
。这是正确的吗?@Buttons840是的,完全正确。:-)
execute (valueB <$> stepper "initial stepper value" fireEvent)
reactimate $ print <$> behavior <@ fireEvent