Exportar funções foi abordado no primeiro conceito, por isso aqui fica uma revisão rápida.
Cada ficheiro em Elm é um módulo e tem de conter uma instrução module antes de todo o resto do código.
Os nomes dos módulos têm de corresponder ao nome do ficheiro, por isso o módulo Calculator tem de estar no ficheiro Calculator.elm, e o módulo Parser.Utils tem de estar no ficheiro Parser/Utils.elm.
Tudo o que é definido dentro de um módulo tem âmbito privado e não pode ser acedido a partir de fora desse módulo, 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
Para acederes a funções definidas noutros módulos, importas esses módulos. Quando importas um módulo, ficas com acesso a todas as funções que ele expôs. Mas a forma como lhes acedes varia consoante a maneira como importas o módulo.
As importações qualificadas são o comportamento predefinido, e para acederes a uma função desse módulo (por exemplo, a função map do módulo List) escreves o nome do módulo como prefixo (List.map).
As importações abertas dão acesso direto às funções expostas desse módulo, sem prefixo. Fazem-se com a palavra-chave exposing, como um espelho da que usas nas exportações. Podes expor todas as funções disponíveis (com ..) ou apenas algumas (por exemplo, map).
Também podes importar tipos e os respetivos construtores de outros módulos, mas isso é um conceito mais à frente.
Dá-se preferência às importações qualificadas, para maior clareza e para evitar 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
As anotações de tipo definem-se com name : parameter types -> return type, sendo os tipos dos parâmetros também separados por ->.
add : Int -> Int -> Int
add number1 number2 = number1 + number2
Podes usar parênteses para definir parâmetros de funções (que são eles próprios definidos com a mesma sintaxe, daí a necessidade dos parênteses).
-- Transform every character in a string
map : (Char -> Char) -> String -> String
map charMapperFunction string =
-- ...
https://elm-lang.org/docs/syntax#type-annotations
Em Elm existem dois tipos de números, 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 costumam funcionar num tipo ou no 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 num Int com semânticas diferentes.
https://package.elm-lang.org/packages/elm/core/latest/Basics#Int
Para descrever palavras e frases no código, o Elm tem um tipo String nativo.
Os literais de string escrevem-se entre aspas duplas, como "Hello World!".
O operador de concatenação de strings ++ e o operador de igualdade == estão disponíveis por predefiniçã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 tem de ser importado.
https://package.elm-lang.org/packages/elm/core/latest/String
Neste exercício vais escrever algum código para ajudar a Betty's Bike Shop, uma loja online de bicicletas e peças. Tens três tarefas, com o objetivo de mostrar corretamente os preços das bicicletas e das peças no site.
penceToPounds
O teu colega já escreveu o esqueleto do módulo, com as funções penceToPounds e poundsToString ainda por definir.
No entanto, esqueceu-se de exportar a função penceToPounds, por isso esta não é atualmente visível por outros módulos nem pelo conjunto de testes.
Adiciona penceToPounds à lista de funções exportadas.
Atualmente, o preço está guardado como um número inteiro de pence (a loja de bicicletas fica no Reino Unido).
No site, queremos mostrar o preço em libras, em que 1,00 libra equivale a 100 pence.
A tua segunda tarefa é implementar a função penceToPounds. Ela recebe uma quantidade de pence como Int e converte-a no valor equivalente em libras, como Float.
Também deves definir a anotação de tipo para essa função.
penceToPounds 106
--> 1.06
Como as bicicletas da Betty são vendidas em libras, os preços devem ser mostrados com o símbolo "£".
A tua terceira tarefa é, por isso, implementar a função poundsToString, que recebe uma quantidade de libras como Float e devolve o seu preço como uma String, com o símbolo da libra à frente.
O módulo String contém a função String.fromFloat, que te vai ser útil para isto.
Deves importar o módulo String antes de o usares.
Também deves definir a anotação de tipo para poundsToString.
poundsToString 1.06
--> "£1.06"
Inscreve-te no Exercism para aprenderes e dominares Elm com 28 conceitos110 exercícios, e mentoria humana real, tudo grátis.