【问题标题】:Is there a netwire equivalent of stepper?是否有相当于步进器的网线?
【发布时间】:2017-03-02 20:49:22
【问题描述】:

Reactive-banana 有一个名为stepperMonadMoment m => a -> Event a -> m (Behavior a) 类型)的函数,它将一个事件转换为一个行为,其中行为的值是最后一个事件的值,或者如果还没有事件发生,则为初始值.

在我记不起名字的 Conal Elliott 的一次演讲中,他将其描述为对事件和行为的基本操作之一。但是,我在 netwire 中找不到类似的功能。由于我对 netwire 的了解有限,我希望它具有以下类型:

a -> Wire s e m (Event a) a

  • netwire 有等效功能吗?
  • 如果不是,有什么理由不能做到这一点?
  • 是否有类似的可能,即将事件转化为行为的方式?

【问题讨论】:

    标签: haskell frp netwire


    【解决方案1】:

    我正在寻找的函数名为hold, in Control.Wire.Interval

    这不需要初始值,因为在接收到第一个事件之前,线路会被禁止。如果需要这种行为,可以这样实现

    stepper init = hold <|> pure init
    

    【讨论】:

      【解决方案2】:

      我只能猜测为什么 netwire 不提供。 Control.Wire.Event 中的所有内容都将结果保存在 Events 中,以保存它们何时发生的知识。

      您可以通过使用Control.Wire.Switch中的一种切换方法来退出Events。你正在寻找rSwitch

      -- Beware: untested, untype-checked code
      stepper :: (Monad m) => a -> Wire s e m (Event a) a
      stepper init = switcher . source
        where
           -- source :: Wire s e m (Event a) ((), Event (Wire s e m () a))
           source = arr (\e -> ((), pure <$> e))
           -- switcher :: Wire s e m ((), Event (Wire s e m () a)) a
           switcher = rSwitch (pure init)
      

      在上面的代码中,pure 被用作a -&gt; Wire s e m () a 来创建琐碎的电线。

      【讨论】:

        猜你喜欢
        • 2021-06-04
        • 2010-09-07
        • 2017-01-08
        • 2010-10-16
        • 2023-04-04
        • 2016-02-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多