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) -> Double
verbindet zwei
Double
Kanäle.***
ist der parallele † Kompositionsoperator. Damit könnenmaximum
undminimum
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.