2014-09-29 5 views
7

Gibt es etwas wie reactive-bananasunion Funktion in elerea?Wie vereinheitliche ich zwei oder mehr Signale in eleléa?

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

Dies führt nur die beiden Signale in einen Strom zusammen. Ich bin auf der Suche nach einer effizienten Verbindung einer großen Anzahl (14k) von Signalen im Idealfall:

unions :: [Signal a] -> Signal a 

Es scheint nicht, etwas in der Dokumentation zu sein, noch ist es etwas, das ich als Baustein erkennen konnte dafür .


Edit: außer vielleicht dies:

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 

Aber ... das ist nur hässlich und nicht erfasst die Idee union.

Antwort

4

Es gibt nichts wie union für elerea Signal, weil ein eleera Netzwerk modelliert wird. Ein elerea Signal enthält genau einen Wert bei jedem Schritt, so dass es keine vernünftige Möglichkeit gibt, willkürliche Werte gleichzeitig zu kombinieren. Es gibt jedoch verschiedene Möglichkeiten, Signale zu kombinieren, je nachdem, wie die Werte kombiniert werden sollen.

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

oder Sie können direkt über die Eingänge falten

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 

Wenn Sie tatsächlich über den Wert nicht kümmern und wollen nur sicherstellen, dass das Signal in umgeschaltet wird, können Sie

verwenden
unions_ :: [Signal a] -> Signal() 
unions_ = sequence_ 
Verwandte Themen