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. 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 na vida real, o que não deixa espaço para dados inválidos e torna impossível representar estados impossíveis no código.
type Season
= Spring
| Summer
| Autumn
| Winter
Cada caso de um tipo personalizado pode ter, opcionalmente, dados associados, e casos diferentes podem ter tipos de dados diferentes. Se nenhum dos casos tiver dados associados, a união discriminada é semelhante ao 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 ao indicar o seu nome (Spring), quando este é definido no mesmo módulo, ou é importado com a sintaxe import SeasonModule exposing (Season(..)), ou ao indicar o seu nome totalmente qualificado (Season.Spring) quando é importado com a sintaxe import SeasonModule exposing (Season).
integerTwo = Integer 2
invalid = FlexibleNumber.Invalid
Os tipos personalizados, tal 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 tu e o teu par estão a planear fazer algo agradável juntos. O teu par tem imensas ideias e agora está a pedir-te que as avalies, para descobrirem a atividade em que vão participar.
O teu par propõe as seguintes ideias:
Tens seis tarefas para ajudar a escolher a tua atividade do Dia dos Namorados.
Para cada ideia que o teu par propõe, respondes com uma de três opções: sim, não ou talvez.
Define o Custom Type Approval para representar estas opções com os três casos seguintes: Yes, No e Maybe.
O teu par escolheu dois restaurantes possíveis: um de cozinha coreana e outro de cozinha turca.
Define o Custom Type Cuisine para representar estas cozinhas com os dois casos seguintes: Korean e Turkish.
Há imensos filmes por onde escolher, por isso, para reduzir as opções, o teu par indica também o género.
Define o Custom Type Genre para representar os géneros seguintes como casos: Crime, Horror, Romance e Thriller.
Como foi dito, o teu par apresentou cinco atividades diferentes: jogar um jogo de tabuleiro, descontrair, ver um filme e ir a um restaurante.
Define o Custom Type Activity para representar estes tipos de atividade:
BoardGame: sem dados associados.Chill: sem dados associados.Movie: tem o Genre como dado associado.Restaurant: tem a Cuisine como dado associado.Finalmente, estás pronto para avaliar as ideias do teu par. É assim que te sentes em relação à ideia do teu par:
Implementa uma função chamada rateActivity que recebe um valor Activity e devolve o Approval com base nas preferências acima:
rateActivity (Restaurant Turkish)
-- => Maybe
Inscreve-te no Exercism para aprenderes e dominares Elm com 28 conceitos110 exercícios, e mentoria humana real, tudo grátis.