4 Stimmen

Wie man mehrere Rohre zu einem verschmilzt oder umgekehrt.

Ist es möglich, mehrere Rohre zu einem Rohr zu fusionieren oder umgekehrt?

Ich habe Schwierigkeiten bei der Implementierung der folgenden Funktionen.

merge :: (Monad m) => [Pipe l i o u m r] -> Pipe [l] [i] [o] m [r]

split :: (Monad m) => Pipe [l] [i] [o] m [r] -> [Pipe l i o u m r]

3voto

Nathan Howell Punkte 4587

Von Ihrem Kommentar her klingt es, als ob Sie das, was Sie versuchen zu tun, einfacher erreichen können, indem Sie einige Sinks einfach zusammenkettet:

import Data.Conduit
import Data.Serialize.Put (putListOf, putWord32le)
import qualified Data.Conduit.Binary as Cb
import qualified Data.Conduit.List as Cl
import qualified Data.Conduit.Cereal as Cc

main :: IO ()
main = do
  let source = Cl.sourceList [[1,2,3],[4,5,6],[7,8,9]]
      encoder = Cc.conduitPut $ putListOf putWord32le

  runResourceT . runPipe $ source >+> do
    Cl.isolate 1 >+> encoder >+> Cb.sinkFile "/tmp/1.bin"
    Cl.isolate 1 >+> encoder >+> Cb.sinkFile "/tmp/2.bin"
    Cl.isolate 1 >+> encoder >+> Cb.sinkFile "/tmp/3.bin"
    Cl.sinkNull

1voto

J. Abrahamson Punkte 68222

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 Eithers 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.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X