Elm (lenguaje de programación)
Elm es un lenguaje de programación para crear interfaces gráficas de usuario para navegadores web. Elm es un lenguaje funcional puro y fuertemente tipificado, y está desarrollado con énfasis en usabilidad, rendimiento, y robustez. Proclama "no tener excepciones en la práctica", hecho posible por el sistema de tipado estático del compilador.

Historia 
Elm fue inicialmente diseñado por Evan Czaplicki en su tesis en 2012. La versión pública de Elm vino con muchos ejemplos y un editor en línea que lo hizo fácil de probar en un navegador web. Evan Czaplicki se unió a Prezi en 2013 para trabajar en Elm, y en 2016 se unió a NoRedInk como Ingeniero de Software trabajando en código libre, también empezando la Elm Software Foundation.

La implementación inicial del compilador producía HTML, CSS, y Javascript. El conjunto de herramientas del lenguaje continuó expandiéndose, ahora incluyendo un REPL, gestor de paquetes, depurador con viaje en el tiempo, e instaladores para Linux, Mac y Windows. Elm también tiene un ecosistema de librerías creadas por la comunidad y un editor en línea avanzado que permite incluir dichas librerías y guardar el código para compartirlo.

Características 
Elm tiene un pequeño pero expresivo conjunto de funcionalidades en el lenguaje, incluyendo expresiones if, creación de variables locales, y expresiones case para la búsqueda de patrones. Como lenguaje funcional,  tiene funciones anónimas, funciones como argumentos, y aplicación parcial (currificación) por defecto. Su semántica incluye valores inmutables, funciones puras, y tipado estático con inferencia de tipos. Los programas de Elm producen HTML a través de un sistema de DOM virtual, y pueden interoperar con otro código Javascript.

Inmutabilidad 
Todos los  valores en Elm son inmutables, un valor no puede ser modificado después de ser creado. Elm utiliza estructuras de datos persistentes para implementar sus librerías Array, Dict, y Set.

Tipos estáticos 
Elm usa un sistema de tipado estático. Las anotaciones de tipos son opcionales, debido a la inferencia de tipos, pero recomendadas. Las anotaciones se ponen en la línea de arriba de la definición (no como en los lenguajes de la familia de C, donde los tipos y los nombres de las variables/parámetros están mezclados). Elm usa un solo carácter : para significar la definición de tipos.

Los tipos incluyen primitivas como números enteros y cadenas de texto, y estructuras de datos básicas como listas (List ), tuplas (Tuple) y records (objetos). Las funciones se escriben con flechas, por ejemplo round : Float -> Int. Union types (tipos de unión) permiten al programador crear tipos personalizados para representar datos de manera apropiada al dominio del problema.

Los tipos pueden referenciar otros tipos, por ejemplo, una lista de números enteros es List Int. Los tipos siempre empiezan con letra en mayúscula, las variables empiezan con letra en minúscula. Por ejemplo, una List a es una lista de valores de tipo desconocido. Hay unos cuantos tipos especiales que los programadores crean para interactionar con el sistema de ejecución de Elm. Por ejemplo, Html Msg representa un árbol del DOM (virtual) cuyos manejadores de eventos producen mensajes de tipo Msg.

En vez de permitir que cualquier valor sea null implícitamente (como undefined o null en JavaScript), la librería estándar de Elm define un tipo Maybe a . El código que produce o maneja valores opcionales lo hace utilizando explícitamente este tipo, y todo el código tiene garantías de que el valor que dice ser de un cierto tipo esta garantizado tener un valor de ese tipo presente.

Sistema de módulos 
Elm tiene un sistema de módulos que permite a los usuarios dividir el código en partes más pequeñas llamadas módulos. Los módulos pueden esconder detalles de implementación, tales como funciones auxiliares, y agrupar código relacionado. Los módulos sirven como espacio de nombres a la hora de importar código, como por ejemplo Tuple.first. Las librerías o paquetes de terceros consisten en uno o más módulos, y están disponibles en la librería de paquetes de Elm. Todos los paquetes y librerías se versionan utilizando versionado semántico, que es verificado y hecho cumplir por el compilador y otras herramientas. Esto significa, que quitar una función, o cambiar su tipo, puede ser hecho solo incrementando la versión mayor.

Interoperabilidad con HTML, CSS y JavaScript 
Elm utiliza una abstracción llamada ports (puertos) para comunicarse con JavaScript. Permite que los valores fluyan hacia dentro y fuera de los programas Elm, haciendo posible la comunicación entre Elm y JavaScript.

Elm tiene una librería llamada elm-html que un programador puede utilizar para escribir HTML y CSS en Elm. Utiliza un sistema de DOM virtual para hacer las actualizaciones en la página más eficientes.

Limitaciones 
Al contrario que Haskell o PureScript, Elm no tiene soporte para higher-kinded types, y por lo tanto no puede proveer abstracciones genéricas para muchas operaciones comunes. Por ejemplo, no hay funciones genéricas map, apply, fold, o filter. En vez dichos nombres hay que utilizar un prefijo con el módulo del tipo al que nos queremos referir, por ejemplo  List.map y Dict.map.

Código de ejemplo 
-- Esto es un comentario de una linea

{- Este es un comentario multi-linea
   Puedes escribir en varias lineas
-}

{- Puedes {- anidar -} comentarios multi-linea -}

-- Aquí definimos un valor llamado ''greeting''. El tipo es inferido como cadena de texto (String)
greeting =
    "Hola Mundo!"

-- Es mejor añadir anotaciones de tipos como documentación
hello : String
hello =
    "Hola."

-- Las funciones se declaran de la misma manera, con los argumentos siguiendo al nombre de la función.
add x y =
    x + y

-- De nuevo, mejor con anotaciones de tipos
hypotenuse : Float -> Float -> Float
hypotenuse a b =
    sqrt (a^2 + b^2)

-- Las funciones están currificadas 
-- Por ejemplo aquí usamos la aplicación parcial de la multiplicación con 2
multiplyBy2 : number -> number
multiplyBy2 =
    (*) 2

-- Las expresiones if se usan para decidir que hacer basado en una condición. Es obligatorio que este siempre el else
absoluteValue : number -> number
absoluteValue number =
    if number < 0 then negate number else number

-- Records (objetos) son usados para poner valores con nombre
book : { title : String, author : String, pages : Int }
book =
    { title = "Steppenwolf"
    , author = "Hesse"
    , pages = 237 
    }

-- Para acceder a un campo del objeto, utilizamos `.`
title : String
title =
    book.title

-- El acceso a campos `.` también se puede utilizar como función
author : String
author =
    .author book

-- Podemos crear nuevos tipos con la palabra `type`
-- El siguiente tipo corresponde a la representación de un árbol binario
type Tree a
    = Empty
    | Node a (Tree a) (Tree a)

-- Es posible inspeccionar estos tipos con expresiones `case`
depth : Tree a -> Int
depth tree =
    case tree of
        Empty ->
            0

        Node value left right ->
            1 + max (depth left) (depth right)

Véase también 

 TypeScript: lenguaje de programación fuertemente tipado que compila a JavaScript

Referencias

Enlaces externos 

 Web oficial
 Guía oficial de Elm (Inglés)

Software de 2012
Lenguajes funcionales
Elm es un lenguaje de programación para crear interfaces gráficas de usuario para navegadores web . Elm es un lenguaje funcional puro y fuertemente tipificado , y está desarrollado con énfasis en usabilidad , rendimiento , y robustez . Proclama " no tener excepciones en la práctica " , hecho posible por el sistema de tipado estático del compilador . Historia Elm fue inicialmente diseñado por Evan Czaplicki en su tesis en La versión pública de Elm vino con muchos ejemplos y un editor en línea que lo hizo fácil de probar en un navegador web . Evan Czaplicki se unió a Prezi enpara trabajar en Elm , y ense unió a NoRedInk como Ingeniero de Software trabajando en código libre , también empezando la Elm Software Foundation . La implementación inicial del compilador producía HTML , CSS , y Javascript . El conjunto de herramientas del lenguaje continuó expandiendo se , ahora incluyendo un REPL , gestor de paquetes , depurador con viaje en el tiempo , e instaladores para Linux , Mac y Windows . Elm también tiene un ecosistema de librerías creadas por la comunidad y un editor en línea avanzado que permite incluir dichas librerías y guardar el código para compartir lo . Características Elm tiene un pequeño pero expresivo conjunto de funcionalidades en el lenguaje , incluyendo expresiones if , creación de variables locales , y expresiones case para la búsqueda de patrones . Como lenguaje funcional , tiene funciones anónimas , funciones como argumentos , y aplicación parcial ( currificación ) por defecto . Su semántica incluye valores inmutables , funciones puras , y tipado estático con inferencia de tipos . Los programas de Elm producen HTML a través de un sistema de DOM virtual , y pueden interoperar con otro código Javascript . Inmutabilidad Todos los valores en Elm son inmutables , un valor no puede ser modificado después de ser creado . Elm utiliza estructuras de datos persistentes para implementar sus librerías Array , Dict , y Set . Tipos estáticos Elm usa un sistema de tipado estático . Las anotaciones de tipos son opcionales , debido a la inferencia de tipos , pero recomendadas . Las anotaciones se ponen en la línea de arriba de la definición ( no como en los lenguajes de la familia de C , donde los tipos y los nombres de las variables/parámetros están mezclados ) . Elm usa un solo carácter \ : para significar la definición de tipos . Los tipos incluyen primitivas como números enteros y cadenas de texto , y estructuras de datos básicas como listas ( List ) , tuplas ( Tuple ) y records ( objetos ) . Las funciones se escriben con flechas , por ejemplo round \ : Float -> Int . Union types ( tipos de unión ) permiten al programador crear tipos personalizados para representar datos de manera apropiada al dominio del problema . Los tipos pueden referenciar otros tipos , por ejemplo , una lista de números enteros es List Int . Los tipos siempre empiezan con letra en mayúscula , las variables empiezan con letra en minúscula . Por ejemplo , una List a es una lista de valores de tipo desconocido . Hay unos cuantos tipos especiales que los programadores crean para interactionar con el sistema de ejecución de Elm . Por ejemplo , Html Msg representa un árbol del DOM ( virtual ) cuyos manejadores de eventos producen mensajes de tipo Msg . En vez de permitir que cualquier valor sea null implícitamente ( como undefined o null en JavaScript ) , la librería estándar de Elm define un tipo Maybe a \ . El código que produce o maneja valores opcionales lo hace utilizando explícitamente este tipo , y todo el código tiene garantías de que el valor que dice ser de un cierto tipo esta garantizado tener un valor de ese tipo presente . Sistema de módulos Elm tiene un sistema de módulos que permite a los usuarios dividir el código en partes más pequeñas llamadas módulos . Los módulos pueden esconder detalles de implementación , tales como funciones auxiliares , y agrupar código relacionado . Los módulos sirven como espacio de nombres a la hora de importar código , como por ejemplo Tuple.first . Las librerías o paquetes de terceros consisten en uno o más módulos , y están disponibles en la librería de paquetes de Elm . Todos los paquetes y librerías se versionan utilizando versionado semántico , que es verificado y hecho cumplir por el compilador y otras herramientas . Esto significa , que quitar una función , o cambiar su tipo , puede ser hecho solo incrementando la versión mayor . Interoperabilidad con HTML , CSS y JavaScript Elm utiliza una abstracción llamada ports ( puertos ) para comunicar se con JavaScript . Permite que los valores fluyan hacia dentro y fuera de los programas Elm , haciendo posible la comunicación entre Elm y JavaScript . Elm tiene una librería llamada elm-html que un programador puede utilizar para escribir HTML y CSS en Elm . Utiliza un sistema de DOM virtual para hacer las actualizaciones en la página más eficientes . Limitaciones Al contrario que Haskell o PureScript , Elm no tiene soporte para higher-kinded types , y por lo tanto no puede proveer abstracciones genéricas para muchas operaciones comunes . Por ejemplo , no hay funciones genéricas map , apply , fold , o filter . En vez dichos nombres hay que utilizar un prefijo con el módulo del tipo al que nos queremos referir , por ejemplo List.map y Dict.map . Código de ejemplo -- Esto es un comentario de una linea { - Este es un comentario multi-linea Puedes escribir en varias lineas - } { - Puedes { - anidar - } comentarios multi-linea - } -- Aquí definimos un valor llamado ' ' greeting ' ' . El tipo es inferido como cadena de texto ( String ) greeting = " Hola Mundo ! " -- Es mejor añadir anotaciones de tipos como documentación hello \ : String hello = " Hola . " -- Las funciones se declaran de la misma manera , con los argumentos siguiendo al nombre de la función . add x y = x + y -- De nuevo , mejor con anotaciones de tipos hypotenuse \ : Float -> Float -> Float hypotenuse a b = sqrt ( a^2 + b^2 ) -- Las funciones están currificadas -- Por ejemplo aquí usamos la aplicación parcial de la multiplicación con 2 multiplyBy2 \ : number -> number multiplyBy2 = ( * ) 2 -- Las expresiones if se usan para decidir que hacer basado en una condición . Es obligatorio que este siempre el else absoluteValue \ : number -> number absoluteValue number = if number <then negate number else number -- Records ( objetos ) son usados para poner valores con nombre book \ : { title \ : String , author \ : String , pages \ : Int } book = { title = " Steppenwolf " , author = " Hesse " , pages = } -- Para acceder a un campo del objeto , utilizamos `.` title \ : String title = book.title -- El acceso a campos `.` también se puede utilizar como función author \ : String author = \ .author book -- Podemos crear nuevos tipos con la palabra `type` -- El siguiente tipo corresponde a la representación de un árbol binario type Tree a = Empty | Node a ( Tree a ) ( Tree a ) -- Es posible inspeccionar estos tipos con expresiones `case` depth \ : Tree a -> Int depth tree = case tree of Empty -> 0 Node value left right -> + max ( depth left ) ( depth right ) Vea se también TypeScript : lenguaje de programación fuertemente tipado que compila a JavaScript Referencias Enlaces externos Web oficial Guía oficial de Elm ( Inglés ) Software de Lenguajes funcionales