Os tipos personalizados são a forma de definir novos tipos de dados em Gleam. Podem ter várias variantes, cada uma com o seu próprio nome.
pub type Season {
Spring
Summer
Autumn
Winter
}
Cada caso de um tipo personalizado pode, opcionalmente, conter alguns dados, e casos diferentes podem ter tipos de dados diferentes. Quando uma variante contém dados, chama-se registo.
pub type Number {
SomeInt(Int)
SomeFloat(Float)
Invalid
}
Podes criar um valor para um caso específico indicando o seu nome, se ele não tiver dados adicionais (Spring), ou chamando-o como uma função, se tiver (SomeInt(2)).
let spring = Spring
let integerTwo = SomeInt(2)
Os tipos personalizados, tal como tudo em Gleam, têm igualdade estrutural, o que significa que dois valores da mesma variante e com os mesmos dados são equivalentes.
Spring == Spring // -> True
Spring == Autumn // -> False
SomeInt(2) == SomeInt(2) // -> True
SomeInt(2) == SomeFloat(2.0) // -> False
Podes fazer correspondência de padrões com as variantes de um tipo personalizado usando expressões case.
import gleam/int
import gleam/float
pub fn describe(flexible_number: Number) -> String {
case flexible_number {
SomeFloat(f) -> "Float: " <> float.to_string(f)
SomeInt(i) -> "Int: " <> int.to_string(i)
Invalid -> "Neither a float nor an int"
}
}
Neste exercício, é o Dia dos Namorados e tu e o teu parceiro estão a planear fazer algo agradável juntos. O teu parceiro tem imensas ideias e está agora a pedir-te para avaliares as ideias, para encontrarem a atividade em que vão participar.
O teu parceiro 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 parceiro propõe, respondes com uma de três opções: sim, não ou talvez.
Define o tipo personalizado Approval para representar estas opções como os três casos seguintes: Yes, No e Maybe.
O teu parceiro escolheu dois restaurantes possíveis: um de cozinha coreana e o outro de cozinha turca.
Define o tipo personalizado Cuisine para representar estas cozinhas como os dois casos seguintes: Korean e Turkish.
Há imensos filmes para escolher, por isso, para reduzir as opções, o teu parceiro também indica o respetivo género.
Define o tipo personalizado Genre para representar os seguintes géneros como casos: Crime, Horror, Romance e Thriller.
Como já foi dito, o teu parceiro propôs cinco atividades diferentes: jogar um jogo de tabuleiro, relaxar, ver um filme, ir a um restaurante e dar um passeio.
Define o tipo personalizado Activity para representar estes tipos de atividade:
BoardGame: sem dados associados.Chill: sem dados associados.Movie: tem o Genre como dados associados.Restaurant: tem o Cuisine como dados associados.Walk: tem um Int que representa o número de quilómetros a percorrer como dados associados.Por fim, chegou a altura de avaliares as ideias do teu parceiro. É assim que te sentes em relação à ideia do teu parceiro:
Implementa uma função chamada rate_activity que recebe um Activity e devolve o Approval com base nos sentimentos acima:
rate_activity(Restaurant(Turkish))
// -> Maybe
Inscreve-te no Exercism para aprenderes e dominares Gleam com 33 conceitos122 exercícios, e mentoria humana real, tudo grátis.