b'\n_START_ARTICLE_\nElm (lenguaje de programaci\xc3\xb3n)\n_START_SECTION_\nHistoria\n_START_PARAGRAPH_\nElm fue inicialmente dise\xc3\xb1ado por Evan Czaplicki en su tesis en 2012.\xe2\x80\x8b La versi\xc3\xb3n p\xc3\xbablica de Elm vino con muchos ejemplos y un editor on-line que lo hizo f\xc3\xa1cil de probar en un navegador\xc2\xa0web.\xe2\x80\x8b Evan Czaplicki se uni\xc3\xb3 a\xc2\xa0Prezi en 2013 para trabajar en Elm,\xe2\x80\x8b y en 2016 se uni\xc3\xb3 a NoRedInk como\xc2\xa0Ingeniero de Software\xc2\xa0trabajando en c\xc3\xb3digo libre, tambi\xc3\xa9n empezando la Elm Software Foundation.\xe2\x80\x8b_NEWLINE_La implementaci\xc3\xb3n inicial del compilador produc\xc3\xada\xc2\xa0HTML, CSS, y Javascript.\xe2\x80\x8b El conjunto de herramientas del lenguaje continu\xc3\xb3 expandi\xc3\xa9ndose, ahora incluyendo un REPL\xe2\x80\x8b, gestor de paquetes\xe2\x80\x8b, depurador con viaje en el tiempo\xe2\x80\x8b, e instaladores para Mac y Windows.\xe2\x80\x8b Elm tambi\xc3\xa9n tiene un ecosistema de librer\xc3\xadas creadas por la comunidad\xe2\x80\x8b y un editor on-line avanzado que permite incluir dichas librer\xc3\xadas y guardar el c\xc3\xb3digo para compartirlo.\xe2\x80\x8b\n_START_SECTION_\nCaracter\xc3\xadsticas\n_START_PARAGRAPH_\nElm tiene un peque\xc3\xb1o pero expresivo conjunto de funcionalidades en el lenguaje, incluyendo expresiones if, creaci\xc3\xb3n de variables locales, y expresiones case para la b\xc3\xbasqueda de patrones.\xe2\x80\x8b Como lenguaje funcional,  tiene funciones an\xc3\xb3nimas, funciones como argumentos, y aplicaci\xc3\xb3n parcial (currificaci\xc3\xb3n) por defecto. Su sem\xc3\xa1ntica incluye valores inmutables, funciones puras, y tipado est\xc3\xa1tico con inferencia de tipos. Los programas de Elm producen HTML a trav\xc3\xa9s de un sistema de DOM virtual, y pueden interoperar con otro c\xc3\xb3digo Javascript.\n_START_SECTION_\nInmutabilidad\n_START_PARAGRAPH_\nTodos los  valores en Elm son inmutables, un valor no puede ser modificado despu\xc3\xa9s de ser creado. Elm utiliza estructuras de datos persistentes\xc2\xa0para implementar sus librer\xc3\xadas Array, Dict, y Set.\xe2\x80\x8b\n_START_SECTION_\nTipos est\xc3\xa1ticos\n_START_PARAGRAPH_\nElm usa un sistema de tipado est\xc3\xa1tico. Las anotaciones de tipos son opcionales, debido a la inferencia de tipos, pero recomendadas. Las anotaciones se ponen en la l\xc3\xadnea de arriba de la definici\xc3\xb3n (no como en los lenguajes de la familia de C, donde los tipos y los nombres de las variables/par\xc3\xa1metros est\xc3\xa1n mezclados). Elm usa un solo car\xc3\xa1cter : para significar la definici\xc3\xb3n de tipos._NEWLINE_Los tipos incluyen primitivas como n\xc3\xbameros enteros y cadenas de texto, y estructuras de datos b\xc3\xa1sicas como listas (List ), tuplas (Tuple) y records (objetos). Las funciones se escriben con flechas, por ejemplo round\xc2\xa0: Float -> Int. Union types (tipos de uni\xc3\xb3n) permiten al programador crear tipos personalizados para representar datos de manera apropiada al dominio del problema.\xe2\x80\x8b_NEWLINE_Los tipos pueden referenciar otros tipos, por ejemplo, una lista de n\xc3\xbameros enteros es List Int. Los tipos siempre empiezan con letra en may\xc3\xbascula, las variables empiezan con letra en min\xc3\xbascula. 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\xc3\xb3n de Elm. Por ejemplo, Html Msg representa un \xc3\xa1rbol del DOM (virtual) cuyos manejadores de eventos producen mensajes de tipo Msg._NEWLINE_En vez de permitir que cualquier valor sea null impl\xc3\xadcitamente (como undefined o null en JavaScript), la librer\xc3\xada est\xc3\xa1ndar de Elm define un tipo Maybe a . El c\xc3\xb3digo que produce o maneja valores opcionales lo hace utilizando expl\xc3\xadcitamente este tipo, y todo el c\xc3\xb3digo tiene garant\xc3\xadas de que el valor que dice ser de un cierto tipo esta garantizado tener un valor de ese tipo presente.\n_START_SECTION_\nSistema de m\xc3\xb3dulos\n_START_PARAGRAPH_\nElm tiene un sistema de m\xc3\xb3dulos que permite a los usuarios dividir el c\xc3\xb3digo en partes m\xc3\xa1s peque\xc3\xb1as llamadas m\xc3\xb3dulos. Los m\xc3\xb3dulos pueden esconder detalles de implementaci\xc3\xb3n, tales como funciones auxiliares, y agrupar c\xc3\xb3digo relacionado. Los m\xc3\xb3dulos sirven como espacio de nombres a la hora de importar c\xc3\xb3digo, como por ejemplo Tuple.first. Las librer\xc3\xadas o paquetes de terceros consisten en uno o m\xc3\xa1s m\xc3\xb3dulos, y est\xc3\xa1n disponibles en la librer\xc3\xada de paquetes de Elm. Todos los paquetes y librer\xc3\xadas se versionan utilizando versionado sem\xc3\xa1ntico, que es verificado y hecho cumplir por el compilador y otras herramientas. Esto significa, que quitar una funci\xc3\xb3n, o cambiar su tipo, puede ser hecho solo incrementando la versi\xc3\xb3n mayor.\n_START_SECTION_\nInteroperabilidad con HTML, CSS y JavaScript\n_START_PARAGRAPH_\nElm utiliza una abstracci\xc3\xb3n llamada ports (puertos) para comunicarse con JavaScript.\xe2\x80\x8b Permite que los valores fluyan hacia dentro y fuera de los programas Elm, haciendo posible la comunicaci\xc3\xb3n entre Elm y JavaScript._NEWLINE_Elm tiene una librer\xc3\xada llamada elm-html que un programador puede utilizar para escribir HTML y CSS en Elm.\xe2\x80\x8b Utiliza un sistema de DOM virtual para hacer las actualizaciones en la p\xc3\xa1gina m\xc3\xa1s eficientes.\xe2\x80\x8b\n_START_SECTION_\nLimitaciones\n_START_PARAGRAPH_\nAl contrario que Haskell o PureScript, Elm no tiene soporte para higher-kinded types, y por lo tanto no puede proveer abstracciones gen\xc3\xa9ricas para muchas operaciones comunes.\xe2\x80\x8b Por ejemplo, no hay funciones gen\xc3\xa9ricas map, apply, fold, o filter. En vez dichos nombres hay que utilizar un prefijo con el m\xc3\xb3dulo del tipo al que nos queremos referir, por ejemplo  List.map y Dict.map.\n_START_SECTION_\nC\xc3\xb3digo de ejemplo\n_START_PARAGRAPH_\n-- Esto es un comentario de una linea{- Este es un comentario multi-linea   Puedes escribir en varias lineas-}{- Puedes {- anidar -} comentarios multi-linea -}-- Aqu\xc3\xad definimos un valor llamado \'\'greeting\'\'. El tipo es inferido como cadena de texto (String)greeting =_NEWLINE_    "Hola Mundo!"-- Es mejor a\xc3\xb1adir anotaciones de tipos como documentaci\xc3\xb3nhello : Stringhello =_NEWLINE_    "Hola."-- Las funciones se declaran de la misma manera, con los argumentos siguiendo al nombre de la funci\xc3\xb3n.add x y =_NEWLINE_    x + y-- De nuevo, mejor con anotaciones de tiposhypotenuse : Float -> Float -> Floathypotenuse a b =_NEWLINE_    sqrt (a^2 + b^2)-- Las funciones est\xc3\xa1n currificadas -- Por ejemplo aqu\xc3\xad usamos la aplicaci\xc3\xb3n parcial de la multiplicaci\xc3\xb3n con 2multiplyBy2 : number -> numbermultiplyBy2 =_NEWLINE_    (*) 2-- Las expresiones if se usan para decidir que hacer basado en una condici\xc3\xb3n. Es obligatorio que este siempre el elseabsoluteValue : number -> numberabsoluteValue number =_NEWLINE_    if number < 0 then negate number else number-- Records (objetos) son usados para poner valores con nombrebook : { title : String, author : String, pages : Int }book =_NEWLINE_    { title = "Steppenwolf"_NEWLINE_    , author = "Hesse"_NEWLINE_    , pages = 237 _NEWLINE_    }-- Para acceder a un campo del objeto, utilizamos `.`title : Stringtitle =_NEWLINE_    book.title-- El acceso a campos `.` tambi\xc3\xa9n se puede utilizar como funci\xc3\xb3nauthor : Stringauthor =_NEWLINE_    .author book-- Podemos crear nuevos tipos con la palabra `type`-- El siguiente tipo corresponde a la representaci\xc3\xb3n de un \xc3\xa1rbol binariotype Tree a_NEWLINE_    = Empty_NEWLINE_    | Node a (Tree a) (Tree a)-- Es posible inspeccionar estos tipos con expresiones `case`depth : Tree a -> Intdepth tree =_NEWLINE_    case tree of_NEWLINE_        Empty ->_NEWLINE_            0_NEWLINE__NEWLINE_        Node value left right ->_NEWLINE_            1 + max (depth left) (depth right)'