是否有相当于步进器的网线?
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是否有同等功能?
- 如果不是,有什么理由不能做到这一点?
- 是否有任何类似的可能,即将事件转化为行为的方法?
我只能猜测为什么 netwire 不提供。 Control.Wire.Event
中的所有内容都将结果保存在 Event
中,以了解它们何时发生。
您可以使用 Control.Wire.Switch
. You're looking for rSwitch
中的一种切换方法退出 Event
s。
-- 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
Reactive-banana 有一个名为 stepper
的函数(类型为 MonadMoment m => a -> Event a -> m (Behavior a)
),它将事件转换为行为,其中行为的值是最后一个事件的值,或初始值如果还没有事件发生。
在 Conal Elliott 的一次演讲中,我记不起名字了,他将此描述为对事件和行为的基本操作之一。但是,我在 netwire 中找不到类似的功能。由于我对 netwire 的了解有限,我希望它的类型为:
a -> Wire s e m (Event a) a
- netwire是否有同等功能?
- 如果不是,有什么理由不能做到这一点?
- 是否有任何类似的可能,即将事件转化为行为的方法?
我只能猜测为什么 netwire 不提供。 Control.Wire.Event
中的所有内容都将结果保存在 Event
中,以了解它们何时发生。
您可以使用 Control.Wire.Switch
. You're looking for rSwitch
中的一种切换方法退出 Event
s。
-- 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