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

fho*_*fho 7 haskell frp elerea

reactive-bananas union功能elerea吗?

union :: Signal a -> Signal a -> Signal a
Run Code Online (Sandbox Code Playgroud)

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

unions :: [Signal a] -> Signal a
Run Code Online (Sandbox Code Playgroud)

文档中似乎没有任何内容,也没有任何我认为可以作为构建块的内容.


编辑:除了可能这个:

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
Run Code Online (Sandbox Code Playgroud)

但是......这只是丑陋而且没有捕捉到的想法union.

Joh*_*n L 4

union由于 elerea 网络的建模方式,没有什么比 elerea 的信号更相似的了。信号elerea在每一步只包含一个值,因此没有明智的方法可以同时组合任意值。但是,您可以通过几种不同的方式来组合信号,具体取决于值的组合方式。

unions :: [Signal a] -> Signal [a]
unions = sequence    -- or Data.Traversable.sequenceA
Run Code Online (Sandbox Code Playgroud)

或者您可以直接折叠输入

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
Run Code Online (Sandbox Code Playgroud)

如果您实际上并不关心该值,而只是想确保信号已接通,则可以使用

unions_ :: [Signal a] -> Signal ()
unions_ = sequence_
Run Code Online (Sandbox Code Playgroud)