是否有相当于步进器的网线?

Is there a netwire equivalent of stepper?

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

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

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

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

您可以使用 Control.Wire.Switch. You're looking for rSwitch 中的一种切换方法退出 Events。

-- 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 -> Wire s e m () a 来创建普通的连线。

我要找的函数叫做 hold, in Control.Wire.Interval

这不需要初始值,因为在接收到第一个事件之前,电线一直处于抑制状态。如果需要这种行为,可以这样实现

stepper init = hold <|> pure init