Un tipo es un tipo genérico cuando puede contener valores de cualquier tipo usando un parámetro de tipo.
Por ejemplo, este tipo Box tiene el parámetro de tipo a (se escribe con letras minúsculas).
pub type Box(a) {
Box(a)
}
El parámetro de tipo a es un marcador de posición para cualquier tipo, por lo que Box se puede usar con strings, ints o cualquier otro tipo.
Box("Hello, Joe!") // The type is Box(String)
Box(42) // The type is Box(Int)
Un tipo puede tener varios parámetros de tipo separándolos con comas.
pub type Pair(a, b) {
Pair(a, b)
}
Los parámetros de tipo también se pueden usar en los argumentos de las funciones.
Esta función recibe un valor del tipo a y llama dos veces a una función que recibe un a y devuelve un b.
pub fn twice(value: a, f: fn(a) -> b) -> b {
f(value)
f(value)
}
// The type is fn(String, fn(String) -> Nil) -> Nil
twice("Hello, Joe!", io.println)