# Fletxa (programació funcional)

En programació funcional una Fletxa s'utilitza en el llenguatge de programació Haskell i és un TAD que modela la precedència temporal de computacions basant-se en l'encadenament de funcions amb efectes col·laterals.
Una fletxa, concepte desenvolupat per John Hughes, és una generalització d'una funció (amb un sol tipus d'entrada i un de sortida) on el resultat pot dependre d'efectes col·laterals o bé ser independent de l'entrada.
Generalitza el concepte de Mònada, d'encadenament d'accions amb efecte col·lateral. Les mònades en són un cas particular anomenat ArrowApply. A més incorpora més informació de tipus que no el del resultat a les mònades, facilitant la composició i permetent evitar fuites d'ús de memòria.
Té aplicació en programació reactiva funcional (tractament de senyals i altres fluxos d'informació).
L'abstracció Fletxa va ser descrita per primer cop per John Hughes al seu document "Generalising Monads to Arrows" com a solució als problemes d'un analitzador sintàctic. Einar Karttunen en va escriure una implementació anomenada PArrows que aproxima les prestacions de l'actual biblioteca d'anàlisi sintàctic de Haskell anomenada Parsec.
Aquí presentem un aspecte pràctic al Haskell. Per una versió amb fonaments teòrics consulteu la versió anglesa o completeu-ne, qui en sàpiga més, l'exposició.

## Generalització de la Mònada - Fletxes de Kleisli

Seguint el document i partint de l'encadenament de resultats de les computacions mònada
Això mostra que les fletxes generalitzen les mònades. Per cada tipus mònada hi ha un tipus fletxa corresponent. (Del doc. "Generalizing Monads to Arrows".

## Fletxes i Parells

A les mònades les operacions return i (>>=) són suficients per efectuar càlculs com ara la suma de resultats de computacions.
A les fletxes, arr i (>>>) no són suficients per efectuar el mateix càlcul. Cal trobar una manera de combinar el resultat de la primera computació amb el resultat de la segona per tenir-los a punt per al càlcul. Cal introduir un altre combinador (first: converteix una fletxa en una altra sobre parells, actuant sobre el primer element).
El nou operador first converteix una fletxa de b a c en una fletxa sobre un parell, transformant-ne el primer element.
Amb aquestes definicions la suma de resultats de computacions fletxa queda completament definida.

## La definició a GHC

A banda de la descripció precedent que correspon a un document de l'any 1998, l'actual definició a GHC de la classe Arrow deriva de la classe Category que generalitza les funcions, amb les operacions identitat i composició.
La definició actual de (>>>), seqüenciació temporal, és igual a la composició de funcions (classe Category).
La classe Arrow (derivada de Category) requereix només la definició mínima de arr i first, incorporant a més, dins la classe, les operacions second, (***) i (&&&) corresponent a les descrites més amunt del document de John Hughes de 1998.

## combinació de Fletxes i sintaxi específica

Podem combinar les fletxes aparellant entrades i sortides
* en tipus producte Tupla2 (classe Arrow)
** (***): combina aparellant entrades i sortides
** (&&&): mateix tipus d'entrada, aparella sortides
* en tipus suma Either (classe ArrowChoice)
** (+++): suma de tipus a l'entrada i a la sortida
** (|||): suma de tipus a l'entrada, mateix tipus de sortida
La clàusula "proc" permet definir un filtre partint d'altres filtres. Exemple:
Equivalent de la fletxa addA expressada en operacions canòniques del tipus

## alternatives ArrowChoice

La classe ArrowChoice ofereix un tractament d'entrades de tipus Either a b permetent tractaments alternatius segons siguin Left o Right.
Millorant els comentaris del mòdul Control.Arrow:

## Exemples
### Ent./Sort. amb fletxes de Kleisli (mònades elevades a fletxes)

Partint de la definició esmentada més amunt, lectura d'any, mes i dia amb comprovació.

### Fletxes amb resultats múltiples - La biblioteca HXT

La biblioteca HXT (Haskell XML Toolbox) tracta els arbres XML amb filtres fletxa. Vegeu.
Per evitar l'ús d'excepcions, HXT dona sempre els múltiples resultats (subarbres) dels filtres en una llista, amb zero o més elements, segons l'èxit i el nombre dels elements resultants.
Extracte del codi del tipus ListArrow.

#### Exemple - Extreure informació d'un document XML

Fitxer xml de dades llibres.xml per a l'exemple.
Aquí la majoria dels filtres Fletxa que es veuen són del de tipus
, el resultat de la seva aplicació serà, excepte al darrer pas, la llista dels subArbres resultants del filtre, i a cadascun dels quals s'aplicarà el filtre següent.
compilació i execució (compilat amb ghc 7.6.3, hxt-9.3.1.3 i hxt-xpath-9.1.2.1):
resultat:

## Fletxes a la pràctica

* La biblioteca Fudgets d'interaccions amb els controls gràfics (de Magnus Carlsson i Thomas Hallgren).
* Yampa (programació reactiva funcional)
* Hxt : Haskell XML Toolbox, emprada més amunt.

## Vegeu també

* Elm (llenguatge de programació): programació reactiva funcional d'interfícies d'usuari en navegadors web.

## Referències

* ↑ «Arrows: A General Interface to Computation» (en anglès). [Consulta: 8 gener 2018].
* 1 2 3 4 5 6 7 8 9 Generalising Monads to Arrows(anglès)
* 1 2 Understanding Arrows(anglès)
* ↑ Control.Arrow Arxivat 2012-08-04 at Archive.is(anglès)
* ↑ Control.Category Arxivat 2014-06-28 a Wayback Machine.(anglès)
* ↑ Sintaxi específica de les Arrow (anglès)
* ↑ La fletxa addA(anglès)
* ↑ HaskellWiki - Haskell XML Toolbox(anglès)
* ↑ ArrowXml de la biblioteca HXT(anglès)
* ↑ API de la biblioteca HXT (anglès)
* ↑ El tipus ListArrow
* ↑ Fudgets - Purely functional processes with applications on Graphical User Interfaces(anglès)
* ↑ Programming with Fudgets(anglès)
* ↑ La biblioteca Yampa(anglès)

## Enllaços externs

* Arrows: A General Interface to Computation(anglès)
* Haskell wikibook - Understanding Arrows(anglès)
* Hughes: Generalizing Monads to Arrows(anglès)
* OPIS - Sistemes distribuïts (amb fletxes) Arxivat 2011-10-30 a Wayback Machine.(anglès) Conté implementació de Fletxes en OCaml Docum. Arxivat 2011-10-30 a Wayback Machine.(anglès)
Viccionari