# Elm (llenguatge de programació)

Elm és un llenguatge de programació funcional i tipatge fort per crear interfícies d'usuari basades en navegadors web, generant estructures dinàmiques basades en JavaScript.
Elm utilitza la programació reactiva funcional i un sistema de gràfics funcional pur per construir interfícies d'usuari sense actualitzacions destructives.
Utilitza una sintaxi molt similar al Haskell però amb diferent semàntica. Elm és d'avaluació estricta (l'avaluació va de l'arrel a les branques començant per la funció main) i primerenca (en un àmbit local les instruccions s'executen per ordre d'aparició; no hi ha clàusules where).

## Descripció

La implementació d'Elm compila a JavaScript i HTML, amb ús d'estils CSS.
A Elm, la programació reactiva funcional, basada en objectes variables i relacions de dependència, relleva l'usuari de programar gestors d'esdeveniments (ang: event handlers) i rutines en mode d'inversió de control (ang:callbacks). També actualitza automàticament els objectes en pantalla.
La presentació gràfica funcional pura relleva d'actualitzar el model de document DOM.
Elm també permet incloure plantilles en llenguatge de marques Markdown.

## Sintaxi i semàntica

Elm adopta una sintaxi a l'estil del Haskell amb influències d'OCaml i F Sostingut. Per exemple l'operador "té tipus" s'escriu amb un únic caràcter ':'; els operadors d'aplicació directa (<|) i aplicació revessa (|>) són tals que (f x) és igual que (f |> x) i igual que (x |> f).
Les definicions de tipus segueixen l'esquema del Haskell. Els tipus dels paràmetres se separen amb (->) i la repetició de variables de tipus indica requeriment de coincidència.
Elm té registres extensibles que forneixen un ús segur de la flexibilitat del model d'objectes de Javascript.
El sistema de tipus suporta tipus primitius com Enters i Coma flotant, dades estructurades com ara tuples i registres, i també tipus abstractes de dades personalitzats.
La implementació de la programació reactiva funcional és moguda per esdeveniments (event-driven), volent dir que les actualitzacions són automàtiques i només en cas de necessitat. Comparteix la màxima semblança amb l'"Event-driven FRP" i l'"Arrowized FRP".
El següent programa mostra la posició del ratolí en moure'l per la pantalla.
El valor de main es mostra en pantalla. La funció asText converteix qualsevol valor en un valor textual representable. La funció lift assegura que asText serà aplicada al senyal Mouse.position a cada canvi del valor.
Elm té un petit però expressiu conjunt de construccions de llenguatge i tractament de llistes. També té un sistema de mòduls i un model d'interfase amb funcions foranes (FFI) per al JavaScript.
Les funcions predefinides són al mòdul Prelude.

### Valors

Els valors són variables o expressions immutables. Entre els seus tipus tenim:
* Bool, number, Int, Float.
* Char, String, Text (incorpora estil)
* Time, Date.
* Element (elements estructurals)
* Form (representació gràfica), Shape, Path.
* Registres anònims extensibles (tractament funcional dels objectes de JavaScript)
* Tipus de dades algebraics (com al Haskell; facilita l'encaix de patrons).

### Senyals (variabilitat)

(Signal tipusDelValor) és el tipus de les variables o expressions que canvien de valor, amb el temps (continus) o per l'efecte d'esdeveniments (discrets).
Els elements de formularis HTML poden variar en estil i en estat. Les funcions que els generen tornen majoritàriement un parell de senyals (senyal_de_l'element, senyal_de_l'estat) com a

#### Senyals dependents

Els senyals dependents són com les cel·les d'un full de càlcul que contenen una fórmula, i el seu valor es recalcula per reacció als canvis dels seus operands.
Es defineixen, o bé amb una expressió de filtre de senyals, o bé per l'aplicació d'una funció de valors, que per aplicar-la a senyals cal elevar-ne el tipus amb lift.
Per emprar un valor en un paràmetre de senyal, cal elevar-ne el tipus convertint-lo a senyal amb la funció Signal.constant.
Si la funció arrel (d'engegada), anomenada main, és un senyal, llavors s'exploraran les dependències entre senyals per obtenir-ne els independents i incloure'n els generadors en el bucle de despatx inicial.
Cada senyal manté una llista dels senyals que en depenen i que farà recalcular en cas que se li actualitzi el valor. No hi pot haver cicles en la relació de dependència.

#### Des de la perspectiva del llenguatge Haskell
##### Senyal com a instància de la classe Functor

Vegeu signatura de la classe Functor a Haskell. De la biblioteca Signal d'Elm:

##### Senyal com a instància de la classe Applicative

Vegeu signatura de la classe Applicative a Haskell. De la biblioteca Signal d'Elm:

#### Transformadors de senyals componibles. Autòmats

És un tipus quina finalitat és possibilitar definir una seqüència de transformacions en cadena (amb possibles efectes col·laterals).
El concepte és originari del TAD Fletxa de Haskell que descriu la seqüenciació d'efectes col·laterals mitjançant l'encadenament de morfismes.
La baula d'aquest encadenament és el tipus Automaton, que designa una aplicació de valors (amb possibles efectes col·laterals) amb un paràmetre d'origen i un resultat. El tipus és polimòrfic amb dos paràmetres, el tipus de l'entrada i el de la sortida (Automaton input output).
Per encadenar-ne dues, el tipus de la sortida de l'autòmata precedent ha de coincidir amb el tipus de l'entrada del següent.
Podem generar-ne a partir d'una funció pura (que només depèn dels paràmetres) o d'una amb memòria. De la biblioteca Automaton d'Elm:
En podem fer un transformador de senyals amb la funció Automaton.run i un valor per defecte.
Els Automatons són componibles:
En realitat aquests autòmats componibles són una versió particular del concepte de les Fletxes de Haskell.

### Contenidors

* List, Set, Dict.
* Maybe (paràmetres opcionals i resultats de funcions definides parcialment, com a Nothing, o bé Just v)
* Either (resultats de funcions definides parcialment amb informació de l'error, com a Right resultat o bé Left error)
Per processar una llista de senyals en un mateix paràmetre:

## Eines

* Editor i compilador en-línia: elm-lang.org/try
* Aprendre amb exemples Arxivat 2016-03-13 a Wayback Machine.
* Biblioteques Elm Arxivat 2013-08-11 a Wayback Machine.
* Funcions predefinides.
* Instal·lació en UNIX mitjançant l'entorn Haskell amb l'instal·lador cabal-dev

## Exemples de Valors (sense variabilitat)
### Text estilitzat

Podeu provar-ho a l'editor online amb compilació i execució.

### Polimorfisme en tipus registres

Vegeu registres.
* incrustant-lo en un element div
* compilació i prova offline

### Parametritzant un programa Elm

La clàusula port per a la interfície FFI (Foreign function interface) amb Javascript es pot aprofitar per proporcionar paràmetres a nivell de html.

## Exemples de Senyals (amb variabilitat)
### Gràfics que varien al Tictac

Fent servir la biblioteca Graphics.Collage

### Comprovador de contrasenya en camp doblat, amb confirmació per canvi de color
## Vegeu també

* Fletxa (programació funcional)

## Referències

* ↑ «Operadors d'aplicació». Arxivat de l'original el 2013-06-07. [Consulta: 25 juliol 2013].
* ↑ Wan, Zhanyong; Taha, Walid; Hudak, Paul «Event-Driven FRP». Proceedings of the 4th International Symposium on Practical Aspects of Declarative Languages, 2002, pàg. 155–172.
* ↑ «Elm - What is Functional Reactive Programming?». Arxivat de l'original el 2018-03-23. [Consulta: 30 juliol 2013].
* 1 2 Elm - The Libraries You Need Arxivat 2016-03-04 a Wayback Machine. Automatons
* 1 2 3 «Biblioteca Prelude». Arxivat de l'original el 2013-09-05. [Consulta: 30 juliol 2013].
* ↑ «Char library». Arxivat de l'original el 2016-03-04. [Consulta: 30 juliol 2013].
* ↑ «Text library». Arxivat de l'original el 2013-08-17. [Consulta: 30 juliol 2013].
* ↑ «Date library». Arxivat de l'original el 2012-12-14. [Consulta: 30 juliol 2013].
* ↑ «Element library». Arxivat de l'original el 2013-09-05. [Consulta: 30 juliol 2013].
* ↑ «Collage library». Arxivat de l'original el 2013-08-17. [Consulta: 30 juliol 2013].
* 1 2 «Registres extensibles». Arxivat de l'original el 2013-04-15. [Consulta: 30 juliol 2013].
* ↑ «Sintaxi de Elm - Tipus de dades algebraics». Arxivat de l'original el 2016-03-13. [Consulta: 30 juliol 2013].
* ↑ «Graphics.Input library». Arxivat de l'original el 2013-08-17. [Consulta: 30 juliol 2013].
* ↑ «Haskell class Functor def.». Arxivat de l'original el 2013-06-09. [Consulta: 30 juliol 2013].
* ↑ «Haskell class Applicative def.». Arxivat de l'original el 2013-12-03. [Consulta: 30 juliol 2013].
* ↑ «Biblioteca Automaton». Arxivat de l'original el 2013-06-13. [Consulta: 30 juliol 2013].
* ↑ Haskell Arrows introduction
* ↑ «Biblioteques». Arxivat de l'original el 2013-08-11. [Consulta: 30 juliol 2013].
* ↑ «JavaScript FFI». Arxivat de l'original el 2016-03-13. [Consulta: 30 juliol 2013].

## Enllaços externs

* Pàgina oficial
Viccionari