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.