Wie mache ich einen "verzweigten" Conduit?

8

Ich möchte, dass die gleichen Daten in zwei "Zweige" aufgeteilt werden, um getrennt verarbeitet zu werden, dann "verbunden" ...

%Vor%

Wie soll ich das machen?

Mein Versuch:

%Vor%

Was soll ich anstelle von undefined s schreiben?

    
Vi. 09.07.2014, 18:34
quelle

1 Antwort

3

Sie können dies tun, aber es ist hässlich, und hoffentlich macht die Implementierung klar, warum es hässlich ist und keine eingebaute Eigenschaft von Conduit:

%Vor%

(Hinweis: Ich habe Ihre Typ-Signatur ein wenig optimiert, ich nehme an, das ist die Typ-Signatur, die Sie wirklich wollten.)

Hier ist der Ansatz: Verwandle q in ein Conduit , das den ersten Wert von jedem eingehenden Tupel nimmt und dann seine Ausgabe mit Left umschließt. In ähnlicher Weise nehmen wir den zweiten Wert von jedem eingehenden Tupel und übergeben ihn an w und umschlingen dann die Ausgabe mit Right .

Nun, da diese Conduit s den gleichen Typ haben (sie nehmen die gleichen Eingangstupel an und erzeugen dieselben Entweder-Werte), kombinieren wir sie mit ZipConduit , die die Eingabe unter allen Komponenten teilt und die Ausgabe in zusammenfasst ein einzelner Stream.

Dieser Stream ist ein Stream von Either c d , nicht der gewünschte (c, d) . Um diese endgültige Konvertierung durchzuführen, verwenden wir collapse . Er löscht einen Wert für Right und Left und fügt sie dann in ein einzelnes Tupel zusammen, das er liefert.

Diese Funktion setzt voraus, dass die Reihenfolge der Ausgabewerte immer ein Wert von w und dann eins von q ist. Wenn etwas anderes passiert, wird eine Ausnahme ausgelöst. Das Problem ist: Es gibt nichts in der Leitung, das andeutet, dass sie in der Tat die Produktion mit der gleichen Rate erzeugen werden. In der Tat ist Conduit speziell dafür ausgelegt, diese Annahme zu vermeiden!

Wenn Sie also wissen, dass Ihre zweikomponentigen Conduits immer mit der gleichen Rate produzieren, funktioniert diese Funktion. Aber das wird nicht allgemein gelten.

    
Michael Snoyman 10.07.2014, 04:59
quelle

Tags und Links