Suche…


Funktionszusammensetzungen mit mehreren Kanälen

Arrow ist, vage gesagt, die Klasse von Morphismen, die ähnliche Funktionen bilden, sowohl in serieller als auch in paralleler Zusammensetzung. Obwohl es als Verallgemeinerung von Funktionen am interessantesten ist, ist die Arrow (->) -Instanz selbst bereits sehr nützlich. Zum Beispiel die folgende Funktion:

spaceAround :: Double -> [Double] -> Double
spaceAround x ys = minimum greater - maximum smaller
 where (greater, smaller) = partition (>x) ys

kann auch mit Pfeilkombinatoren geschrieben werden:

spaceAround x = partition (>x) >>> minimum *** maximum >>> uncurry (-)

Diese Art der Komposition lässt sich am besten mit einem Diagramm visualisieren:

                       ──── minimum ────
                   ╱           *            ╲
──── partition (>x) >>>        *        >>>  uncurry (-) ───
                   ╲           *            ╱
                       ──── maximum ──── 

Hier,

  • Der Operator >>> ist nur eine umgedrehte Version des gewöhnlichen . Kompositionsoperator (es gibt auch eine <<< Version, die von rechts nach links verfasst wird). Es leitet die Daten von einem Verarbeitungsschritt zum nächsten weiter.

  • Das ausgehende zeigt an, dass der Datenfluss in zwei "Kanäle" aufgeteilt ist. In Bezug auf Haskell-Typen wird dies mit Tupeln realisiert:

    partition (>x) :: [Double] -> ([Double], [Double])
    

    teilt den Fluss in zwei [Double] -Kanäle auf, während

    uncurry (-) :: (Double,Double) -> Double
    

    verbindet zwei Double Kanäle.

  • *** ist der parallele Kompositionsoperator. Damit können maximum und minimum unabhängig voneinander auf verschiedenen Kanälen der Daten betrieben werden. Bei Funktionen lautet die Signatur dieses Operators

    (***) :: (b->c) -> (β->γ) -> (b,β)->(c,γ)
    

Zumindest in der Hask- Kategorie (dh in der Arrow (->) Instanz) berechnet f f***g tatsächlich f und g parallel wie in auf verschiedenen Threads. Dies wäre jedoch theoretisch möglich.



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow