【问题标题】:How does `valueB` work? It always returns the same value?`valueB` 是如何工作的?它总是返回相同的值?
【发布时间】:2016-06-19 00:20:44
【问题描述】:

考虑以下代码:

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 的用途是什么,我应该在什么时候使用它?

【问题讨论】:

    标签: haskell reactive-programming frp reactive-banana


    【解决方案1】:

    请记住,Moment(和MomentIO)monad 表示在特定时间发生的计算。组合器valueB 仅返回该时刻的行为值。在你的情况下,那是一开始。

    如果要在不同时间对某个 Behavior 的值进行采样,可以使用 &lt;@&gt;&lt;@ 运算符,它们与 &lt;$&gt;&lt;$ 非常相似。例如,将最后一行替换为

    reactimate $ print <$> behavior <@ fireEvent
    

    将在事件触发的每个时刻打印 Behavior 的值。

    更高级的用法是将valueBexecute 结合使用。

    【讨论】:

    • 我最终意识到valueB 出现在文档的“高阶”部分是有原因的,而且它可能最常与switchB 等其他高阶操作一起出现。这是正确的吗?
    • @Buttons840 是的,完全正确。 :-)
    【解决方案2】:

    根据文档,valueB 获取给定行为的当前值。它适用于某些MonadMoment。在这种情况下,这个“时刻”是创建网络的时间。因此,您始终获得相同的值。您在开始时只要求一次值。

    您不能直接对行为的变化做出反应,因为它们并没有真正通知他们的变化(它们是持续的信号)。

    如果您想查看valueB 的实际应用。我认为execute 函数是您所需要的。

    execute (valueB <$> stepper "initial stepper value" fireEvent)
    

    这当然是一个非常人为的例子,但它应该做你想做的。

    另外,我没有专门使用 ReactiveBanana 的经验,但大多数 FRP 框架的工作方式类似。

    【讨论】:

      猜你喜欢
      • 2014-02-25
      • 1970-01-01
      • 1970-01-01
      • 2019-10-22
      • 2019-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多