Haskell Language
Flèches
Recherche…
Composition de fonction avec plusieurs canaux
Arrow
est, en gros, la classe des morphismes qui composent des fonctions semblables, avec à la fois une composition en série et une «composition parallèle». Bien qu'il soit intéressant de généraliser les fonctions, l'instance Arrow (->)
elle-même est déjà très utile. Par exemple, la fonction suivante:
spaceAround :: Double -> [Double] -> Double
spaceAround x ys = minimum greater - maximum smaller
where (greater, smaller) = partition (>x) ys
peut aussi être écrit avec des combinateurs de flèches:
spaceAround x = partition (>x) >>> minimum *** maximum >>> uncurry (-)
Ce type de composition peut être visualisé avec un diagramme:
──── minimum ────
╱ * ╲
──── partition (>x) >>> * >>> uncurry (-) ───
╲ * ╱
──── maximum ────
Ici,
L' opérateur
>>>
n'est qu'une version inversée de l'ordinaire.
opérateur de composition (il y a aussi une version<<<
qui compose de droite à gauche). Il achemine les données d'une étape de traitement à l'autre.les going
╱
╲
indiquent que le flux de données est divisé en deux «canaux». En termes de types Haskell, ceci est réalisé avec des tuples:partition (>x) :: [Double] -> ([Double], [Double])
divise le flux en deux canaux
[Double]
, tandis queuncurry (-) :: (Double,Double) -> Double
fusionne deux canaux
Double
.***
est l'opérateur de composition parallèle † . Il permet aumaximum
et auminimum
fonctionner indépendamment sur différents canaux des données. Pour les fonctions, la signature de cet opérateur est(***) :: (b->c) -> (β->γ) -> (b,β)->(c,γ)
† Au moins dans la catégorie Hask (c'est-à-dire dans l'instance Arrow (->)
), f***g
ne calcule pas réellement f
et g
en parallèle comme dans, sur des threads différents. Cela serait théoriquement possible, cependant.