4

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

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

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

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

2 回答 2

2

我正在寻找的函数被称为hold, inControl.Wire.Interval

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

stepper init = hold <|> pure init
于 2016-10-20T22:35:43.203 回答
0

我只能猜测为什么 netwire 不提供。一切都Control.Wire.Event将结果保存在Event保存它们何时发生的知识中。

Event您可以通过使用其中一种切换方法来摆脱s Control.Wire.Switch。你正在寻找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创建琐碎的电线。

于 2016-10-20T22:29:45.467 回答