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
的想法。
答案 0 :(得分:4)
由于elerea网络的建模方式,因此对于elerea的信号没有任何类似union
的信号。 elerea
信号在每一步都只包含一个值,因此没有合理的方法可以同时组合任意值。但是,有几种不同的方法可以组合信号,具体取决于值的组合方式。
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_