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 que

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

    fusiona dos canales Double .

  • *** es el operador de composición paralelo. Permite que el maximum y el minimum 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.



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow