Tipos personalizados em Elm representam um número fixo de casos nomeados. Cada valor corresponde exatamente a um dos casos nomeados.
Um tipo personalizado é definido com a palavra-chave type e exige muito pouca sintaxe. Eles são uma das técnicas mais importantes da programação em Elm, e são usados para fazer com que os valores possíveis no código correspondam exatamente aos valores válidos da vida real, o que não deixa espaço para dados inválidos e faz com que estados impossíveis não possam ser representados no código.
type Season
= Spring
| Summer
| Autumn
| Winter
Cada caso de um tipo personalizado pode, opcionalmente, ter dados associados a ele, e casos diferentes podem ter tipos diferentes de dados. Se nenhum dos casos tiver dados associados, a união discriminada é parecida com o que outras linguagens costumam chamar de enumeração (ou enum).
type FlexibleNumber
= Integer Int
| Float Float
| Invalid
Criar um valor para um caso específico pode ser feito referindo-se ao seu nome (Spring), quando ele é definido no mesmo módulo, ou é importado com a sintaxe de estilo import SeasonModule exposing (Season(..)), ou referindo-se ao seu nome totalmente qualificado (Season.Spring) quando importado com a sintaxe de estilo import SeasonModule exposing (Season).
integerTwo = Integer 2
invalid = FlexibleNumber.Invalid
Os tipos personalizados, assim como tudo em Elm, têm igualdade estrutural, o que significa que dois valores para o mesmo caso e com os mesmos dados (opcionais) são equivalentes.
A forma preferida de trabalhar com tipos personalizados é com correspondência de padrões:
let describe flexibleNumber =
case flexibleNumber of
Integer i ->
"Integer: " ++ fromInt(i)
Float f ->
"Float: " ++ fromFloat(f)
Invalid ->
"Invalid"
Neste exercício, é Dia dos Namorados e você e seu par estão planejando fazer algo legal juntos. Seu par tem muitas ideias e agora está pedindo que você avalie cada uma delas, para escolher qual atividade fazer.
Seu par propôs as seguintes ideias:
Você tem seis tarefas para ajudar a escolher a atividade do Dia dos Namorados.
Para cada ideia que seu par propõe, você responde com uma de três opções: yes, no ou maybe.
Defina o Custom Type Approval para representar essas opções com os três casos a seguir: Yes, No e Maybe.
Seu par selecionou dois restaurantes possíveis: um baseado na culinária coreana e o outro na culinária turca.
Defina o Custom Type Cuisine para representar essas culinárias com os dois casos a seguir: Korean e Turkish.
Há muitos filmes para escolher, então, para reduzir as possibilidades, seu par também lista o gênero de cada um.
Defina o Custom Type Genre para representar os gêneros a seguir como casos: Crime, Horror, Romance e Thriller.
Como já foi dito, seu par pensou em cinco atividades diferentes: jogar um jogo de tabuleiro, relaxar, assistir a um filme e ir a um restaurante.
Defina o Custom Type Activity para representar esses tipos de atividade:
BoardGame: sem dados associados.Chill: sem dados associados.Movie: tem o Genre como dado associado.Restaurant: tem o Cuisine como dado associado.Por fim, você está pronto para avaliar as ideias do seu par. É assim que você se sente em relação à ideia do seu par:
Implemente uma função chamada rateActivity que recebe um valor Activity e retorna o Approval com base nos sentimentos acima:
rateActivity (Restaurant Turkish)
-- => Maybe
Crie sua conta no Exercism para aprender e dominar Elm com 28 conceitos110 exercícios e mentoria humana de verdade, tudo de graça.