有一个netwire相当于步进器?

时间:2016-10-20 18:01:58

标签: haskell frp netwire

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

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

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

  • netwire是否具有等效功能?
  • 如果没有,是否有任何理由不能这样做?
  • 是否有类似的可能,即将事件转换为行为的方式?

2 个答案:

答案 0 :(得分:2)

我正在寻找的功能称为hold, in Control.Wire.Interval

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

stepper init = hold <|> pure init

答案 1 :(得分:0)

我只能猜到为什么netwire没有提供。 Control.Wire.Event中的所有内容都会将结果保存在Event中,以保留对其发生时间的了解。

您可以使用切换Control.Wire.Switch中的一种方法退出Event。您正在寻找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 -> Wire s e m () a来创建琐碎的电线。