Haskell Language
Flechas
Buscar..
Composiciones de funciones con múltiples canales.
Arrow
es, vagamente hablando, la clase de morfismos que componen funciones similares, tanto con composición en serie como con "composición paralela". Si bien es más interesante como una generalización de funciones, la instancia de Arrow (->)
sí ya es bastante útil. Por ejemplo, la siguiente función:
spaceAround :: Double -> [Double] -> Double
spaceAround x ys = minimum greater - maximum smaller
where (greater, smaller) = partition (>x) ys
También se puede escribir con combinadores de flechas:
spaceAround x = partition (>x) >>> minimum *** maximum >>> uncurry (-)
Este tipo de composición se puede visualizar mejor con un diagrama:
──── minimum ────
╱ * ╲
──── partition (>x) >>> * >>> uncurry (-) ───
╲ * ╱
──── maximum ────
Aquí,
El operador
>>>
es solo una versión invertida del ordinario.
operador de composición (también hay una versión<<<
que se compone de derecha a izquierda). Canaliza los datos de un paso de procesamiento a otro.los
╲
╱
╲
indican que el flujo de datos se divide en dos "canales". En términos de tipos de Haskell, esto se realiza con tuplas:partition (>x) :: [Double] -> ([Double], [Double])
divide el flujo en dos canales
[Double]
, mientras queuncurry (-) :: (Double,Double) -> Double
fusiona dos canales
Double
.***
es el operador de composición † paralelo. Permite que elmaximum
y elminimum
operen independientemente en diferentes canales de datos. Para funciones, la firma de este operador es(***) :: (b->c) -> (β->γ) -> (b,β)->(c,γ)
† Al menos en la categoría Hask (es decir, en la instancia de Arrow (->)
), f***g
no calcula realmente f
y g
en paralelo como en, en diferentes subprocesos. Sin embargo, esto sería teóricamente posible.