Haskell Language
Pfeile
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ährenduncurry (-) :: (Double,Double) -> Doubleverbindet zwei
DoubleKanäle.***ist der parallele † Kompositionsoperator. Damit könnenmaximumundminimumunabhä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.