我如何统一elerea中的两个或更多信号?

elerea有没有像reactive-bananas union功能的elerea

union :: Signal a -> Signal a -> Signal a

这只是将两个信号合并成一个流。 理想情况下,我正在寻找大量(14k)信号的高效联合:

unions :: [Signal a] -> Signal a

文档中似乎没有任何内容,也没有任何我可以认为是其构建模块的东西。


编辑:除了可能是这样的:

unionSignal :: a -> Signal a -> Signal a -> SignalGen p (Signal a)
unionSignal initial a b = do
  (s,f) <- execute $ external initial
  _ <- effectful1 f a
  _ <- effectful1 f b
  return s

但是......这只是丑陋的,并没有体现出union的想法。


因为elerea网络是如何建模的,所以没有什么东西像elerea信号的unionelerea信号在每个步骤中只包含一个值,因此没有明智的方法可以同时组合任意值。 然而,根据数值应该如何组合,有几种不同的方式可以组合信号。

unions :: [Signal a] -> Signal [a]
unions = sequence    -- or Data.Traversable.sequenceA

或者您可以直接在输入上折叠

foldS :: (a -> b -> b) -> b -> [Signal a] -> Signal b
foldS f b signals = foldr (signal acc -> f <$> signal <*> acc) (return b) signals
-- I think a right fold is more efficient, but it depends on elerea's internals and I'm not sure

如果您实际上并不关心数值,只想确保信号被切换,您可以使用

unions_ :: [Signal a] -> Signal ()
unions_ = sequence_
链接地址: http://www.djcxy.com/p/81723.html

上一篇: How do I unify two or more Signals in elerea?

下一篇: Is Feature Branching still (or ever) considered a bad practice?