Wie andere bereits angemerkt haben, hat das Zusammenführen von Pipes eine Vielzahl von Semantiken.
Ich weiß, dass in pipes-core
(Paolo Capriottis Fork von Gabriel Gonzalezs pipes
-Bibliothek, die eine weitere Implementierung von Iteratees wie conduit
ist) einige sehr allgemeine Codes für monoidale und multiplikative Kategorien vorhanden sind.
http://hackage.haskell.org/packages/archive/pipes-core/0.1.0/doc/html/Control-Pipe-Category.html#t:PipeC
Zum Beispiel können wir mit PipeC
, einem newtype, der die Typvariablen herumbewegt, um PipeC m r
zu einer gültigen Kategorie zu machen, unabhängige Signale als Either
s multiplexen.
Sie haben auch etwas wie sequence
, das über die Monad
-Instanz funktioniert.
sequence :: [m a] -> m [a]
das verschiedene Pipes "vertikal" sequenziert (eine wird dann die nächste), so dass wir etwas ähnliches schreiben können wie (unter Verwendung von Control.Pipe.Pipe
aus Gonzalezs pipes
-Paket)
takeNPipe :: Int -> Pipe a b m [a]
takeNPipe n = sequence (replicate n await)
Der angeforderte Typ impliziert beide Arten von "Zusammenführungen" gleichzeitig. Das ist (meiner Meinung nach) unmöglich, da Sie sowohl parallele (multiplexed) als auch sequentielle (vertikale) Komposition auf einmal wollen.