Los tipos personalizados son la forma de definir nuevos tipos de datos en Gleam. Pueden tener varias variantes, cada una con su propio nombre.
pub type Season {
Spring
Summer
Autumn
Winter
}
Cada caso de un tipo personalizado puede contener datos de forma opcional, y casos distintos pueden tener distintos tipos de datos. Cuando una variante contiene datos, se denomina registro.
pub type Number {
SomeInt(Int)
SomeFloat(Float)
Invalid
}
Se puede crear un valor para un caso concreto refiriéndose a su nombre si no contiene datos adicionales (Spring), o llamándolo como si fuera una función si los contiene (SomeInt(2)).
let spring = Spring
let integerTwo = SomeInt(2)
Los tipos personalizados, como todo en Gleam, tienen igualdad estructural, lo que significa que dos valores de la misma variante y con los mismos datos son equivalentes.
Spring == Spring // -> True
Spring == Autumn // -> False
SomeInt(2) == SomeInt(2) // -> True
SomeInt(2) == SomeFloat(2.0) // -> False
Se puede hacer coincidir patrones sobre las variantes de un tipo personalizado usando expresiones 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"
}
}
En este ejercicio es el día de San Valentín y tú y tu pareja estáis planeando hacer algo bonito juntos. Tu pareja tiene un montón de ideas y ahora te pide que las valores para encontrar la actividad en la que participar.
Tu pareja propone las siguientes ideas:
Tienes seis tareas para ayudarte a elegir la actividad de San Valentín.
Para cada idea que propone tu pareja, respondes con una de estas tres opciones: sí, no o quizá.
Define el tipo personalizado Approval para representar estas opciones con los tres casos siguientes: Yes, No y Maybe.
Tu pareja ha seleccionado dos restaurantes posibles: uno de cocina coreana y otro de cocina turca.
Define el tipo personalizado Cuisine para representar estas cocinas con los dos casos siguientes: Korean y Turkish.
Hay muchísimas películas entre las que elegir, así que, para reducir las opciones, tu pareja también indica su género.
Define el tipo personalizado Genre para representar los siguientes géneros como casos: Crime, Horror, Romance y Thriller.
Como ya se ha dicho, a tu pareja se le han ocurrido cinco actividades distintas: jugar a un juego de mesa, relajarse, ver una película, ir a un restaurante y dar un paseo.
Define el tipo personalizado Activity para representar estos tipos de actividad:
BoardGame: sin datos asociados.Chill: sin datos asociados.Movie: tiene su Genre como datos asociados.Restaurant: tiene su Cuisine como datos asociados.Walk: tiene un Int que representa el número de kilómetros que hay que caminar como datos asociados.Por último, ya estás listo para valorar las ideas de tu pareja. Así es como te sientes respecto a cada idea:
Implementa una función llamada rate_activity que recibe un valor Activity y devuelve el Approval según las sensaciones anteriores:
rate_activity(Restaurant(Turkish))
// -> Maybe
Regístrate en Exercism para aprender y dominar Gleam con 33 conceptos122 ejercicios y mentoría humana real, todo gratis.