# Elm (linguagem de programação)

Elm é uma linguagem de programação específica de domínio para criar declarativamente interfaces gráficas com o usuário baseadas em navegador da web . Elm é puramente funcional e é desenvolvido com ênfase em usabilidade , desempenho e robustez . Ele anuncia "nenhuma exceção de tempo de execução na prática", possibilitada pela verificação de tipo estático do compilador Elm.

## História

Elm foi inicialmente projetado por Evan Czaplicki como sua tese em 2012. O primeiro lançamento do Elm veio com muitos exemplos e um editor online que facilitou a experimentação em um navegador da web . Evan Czaplicki ingressou na Prezi em 2013 para trabalhar na Elm, e em 2016 mudou para a NoRedInk como Engenheiro Open Source, também iniciando a Elm Software Foundation.
A implementação inicial do compilador Elm é direcionada para HTML , CSS e JavaScript . O conjunto de ferramentas principais continuou a se expandir, agora incluindo um REPL, gerenciador de pacotes, depurador de viagem no tempo, e instaladores para Mac e Windows. Elm também tem um ecossistema de bibliotecas criadas pela comunidade e um editor on-line avançado que permite trabalhos salvos e inclusão de bibliotecas comunitárias.

## Características

Elm tem um pequeno mas expressivo conjunto de construções de linguagem, incluindo expressões tradicionais, expressões de expressões para estados locais e expressões de casos para correspondência de padrões . Como linguagem funcional, suporta funções anônimas, funções como argumentos e aplicação parcial (currying) por padrão. Sua semântica inclui valores imutáveis, funções stateless e tipagem estática com inferência de tipos. Programas Elm renderizam HTML através de um DOM virtual e podem interoperar com outro código usando "JavaScript como um serviço".

### Imutabilidade

Todos os valores em Elm são imutáveis , o que significa que um valor não pode ser modificado depois de criado. Elm usa estruturas de dados persistentes para implementar suas bibliotecas Array , Dict e Set .

### Tipos estáticos

Elm é estaticamente digitado. As anotações de tipo são opcionais (devido à inferência de tipos), mas são fortemente incentivadas. As anotações existem na linha acima da definição (diferentemente das linguagens da família C, onde tipos e nomes são intercalados). Elm usa um único cólon para significar "tem tipo".
Os tipos incluem primitivos como inteiros e cadeias de caracteres e estruturas de dados básicas, como listas, tuplas e registros. As funções têm tipos escritos com setas, por exemplo, round : Float -> Int . Os tipos de união permitem que o programador crie tipos personalizados para representar dados de uma maneira que corresponda ao domínio do problema.
Tipos podem se referir a outros tipos, por exemplo, uma List Int . Tipos são sempre capitalizados; nomes de letras minúsculas são variáveis de tipo. Por exemplo, uma List a é uma lista de valores de tipo desconhecido. É o tipo da lista vazia e do argumento para List.length , que é agnóstico para os elementos da lista. Existem alguns tipos especiais que os programadores criam para interagir com o tempo de execução Elm. Por exemplo, Html Msg representa uma árvore DOM (virtual) cujos manipuladores de eventos produzem mensagens do tipo Msg .
Em vez de permitir que qualquer valor seja implicitamente anulável (como um ponteiro undefined ou nulo de um JavaScript), a biblioteca padrão de Elm define Maybe a tipo Maybe a . Código que produz ou manipula um valor opcional faz isso explicitamente usando esse tipo, e todo o outro código é garantido que um valor do tipo reivindicado está realmente presente.

### Sistema de módulos

Elm tem um sistema de módulos que permite aos usuários quebrar o código em partes menores chamadas módulos. Os módulos podem ocultar detalhes de implementação, como funções auxiliares, e agrupar códigos relacionados. Os módulos servem como um namespace para código importado, como Bitwise.and . Bibliotecas de terceiros (ou pacotes) consistem em um ou mais módulos e estão disponíveis na Biblioteca Pública Elm . Todas as bibliotecas são versionadas de acordo com o semver , que é aplicado pelo compilador e outras ferramentas. Ou seja, remover uma função ou alterar seu tipo só pode ser feito em uma versão principal.

### Interoperabilidade com HTML, CSS e JavaScript

Elm usa uma abstração chamada ports para se comunicar com JavaScript . Ele permite que os valores entrem e saiam dos programas Elm, possibilitando a comunicação entre Elm e JavaScript.
Elm tem uma biblioteca chamada elm-html que um programador pode usar para escrever HTML e CSS dentro do Elm. Ele usa uma abordagem DOM virtual para tornar as atualizações eficientes.

## Limitações

Ao contrário do Haskell ou do PureScript, o Elm não tem suporte para tipos mais sofisticados e, portanto, não pode fornecer abstrações genéricas para muitas operações comuns. Por exemplo, não há uma função genérica de map , apply , fold ou filter . Em vez disso, esses nomes são usados como prefixo de seu módulo, como List.map e Dict.map .