Vimos como exportar funções no primeiro conceito; aqui vai uma revisão rápida.
Cada arquivo em Elm é um módulo e precisa conter uma instrução module antes de qualquer outro código.
Os nomes dos módulos precisam corresponder ao nome do arquivo, então o módulo Calculator precisa estar no arquivo Calculator.elm, e o módulo Parser.Utils precisa estar no arquivo Parser/Utils.elm.
Tudo o que é definido dentro de um módulo tem escopo privado e não pode ser acessado de fora dele, a menos que esteja listado em exposing.
-- Calculator.elm
-- Define the Calculator module, and expose the `add` function
module Calculator exposing (add)
six = 3 + 3
add number1 number2 = number1 + number2
-- Calculator.elm
-- Define the Calculator module, and expose everything within: `six` and `add`
module Calculator exposing (..)
six = 3 + 3
add number1 number2 = number1 + number2
https://elm-lang.org/docs/syntax#modules
O acesso a funções definidas em outros módulos é feito por meio de imports. Todas as funções do módulo que foram expostas por ele ficam acessíveis ao importar esse módulo. Mas a forma de acessá-las varia conforme a maneira como o módulo é importado.
Imports qualificados são o padrão, e acessar uma função nesse tipo de módulo (por exemplo, a função map no módulo List) é feito prefixando o nome do módulo (List.map).
Imports abertos permitem acesso direto às funções expostas desse módulo, sem prefixo. Eles são feitos com a palavra-chave exposing, como um espelho da usada nas exportações. Você pode expor todas as funções disponíveis (com ..) ou apenas algumas específicas (por exemplo, map).
Você também pode importar tipos e seus construtores de outros módulos, o que é um conceito mais adiante.
Imports qualificados são preferidos por deixarem o código mais claro e evitarem conflitos de nomes.
-- qualified imports
import List -- List.map, List.foldl
import List as L -- L.map, L.foldl
-- open imports
import List exposing (..) -- map, foldl, concat, ...
import List exposing ( map, foldl ) -- map, foldl, List.concat
https://elm-lang.org/docs/syntax#modules
Anotações de tipo são definidas com name : parameter types -> return type, sendo que os tipos dos parâmetros também são separados por ->.
add : Int -> Int -> Int
add number1 number2 = number1 + number2
Parênteses podem ser usados para definir parâmetros de função (que são eles próprios definidos com a mesma sintaxe, daí a necessidade deles).
-- Transform every character in a string
map : (Char -> Char) -> String -> String
map charMapperFunction string =
-- ...
https://elm-lang.org/docs/syntax#type-annotations
Existem dois tipos de números disponíveis em Elm, definidos pelos tipos Int e Float.
O Int corresponde ao conjunto dos números inteiros, positivos e negativos.
O Float corresponde ao conjunto dos números reais, limitado pela precisão do computador.
As operações definidas sobre números geralmente funcionam com um tipo ou com o outro, mas não misturando os dois.
Existem funções para converter entre os dois, como toFloat, que converte Int em Float, e round, floor, ceiling ou truncate, que convertem um Float em Int com semânticas diferentes.
https://package.elm-lang.org/packages/elm/core/latest/Basics#Int
Para descrever palavras e frases em código, Elm tem um tipo String nativo.
Literais de string são escritos entre aspas duplas, como "Hello World!".
Um operador de concatenação de string ++ e um operador de igualdade == estão disponíveis por padrão.
hello : String -> String
hello subject = "Hello " ++ subject
hello "World!" --> "Hello World!"
A maioria das outras funções de string está no módulo String, que precisa ser importado.
https://package.elm-lang.org/packages/elm/core/latest/String
Neste exercício, você vai escrever um pouco de código para ajudar a Betty's Bike Shop, uma loja online de bicicletas e peças. Você tem três tarefas, com o objetivo de exibir corretamente os preços das bicicletas e das peças no site.
penceToPounds
Uma pessoa da sua equipe já escreveu o esqueleto do módulo, com as funções ainda não definidas penceToPounds e poundsToString.
No entanto, essa pessoa esqueceu de exportar a função penceToPounds, que, por isso, ainda não está visível para outros módulos nem para a suíte de testes.
Adicione penceToPounds à lista de funções exportadas.
Atualmente, o preço é armazenado como um número inteiro de pence (a loja de bicicletas fica no Reino Unido).
No site, queremos mostrar o preço em libras, sendo que 1,00 libra equivale a 100 pence.
Sua segunda tarefa é implementar a função penceToPounds, que recebe uma quantia em pence como Int e a converte no equivalente em libras como Float.
Você também deve definir a anotação de tipo dessa função.
penceToPounds 106
--> 1.06
Como as bicicletas da Betty são vendidas em libras, os preços devem ser exibidos com o símbolo "£".
Sua terceira tarefa é, portanto, implementar a função poundsToString, que recebe uma quantia em libras como Float e retorna o preço exibido como uma String com o símbolo da libra no início.
O módulo String contém a função String.fromFloat, que vai ajudar nisso.
Você deve importar o módulo String antes de usá-lo.
Você também deve definir a anotação de tipo de poundsToString.
poundsToString 1.06
--> "£1.06"
Crie sua conta no Exercism para aprender e dominar Elm com 28 conceitos110 exercícios e mentoria humana de verdade, tudo de graça.