Um tipo é um tipo genérico quando pode conter valores de qualquer tipo usando um parâmetro de tipo.
Por exemplo, este tipo Box tem o parâmetro de tipo a (escrito com letras minúsculas).
pub type Box(a) {
Box(a)
}
O parâmetro de tipo a é um espaço reservado para qualquer tipo, então Box pode ser usado com strings, inteiros ou qualquer outro tipo.
Box("Hello, Joe!") // The type is Box(String)
Box(42) // The type is Box(Int)
Um tipo pode ter vários parâmetros de tipo; basta separá-los com vírgulas.
pub type Pair(a, b) {
Pair(a, b)
}
Parâmetros de tipo também podem ser usados nos argumentos de funções.
Esta função recebe um valor do tipo a e chama duas vezes uma função que recebe um a e retorna um 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)