Un type est un type générique lorsqu'il peut contenir des valeurs de n'importe quel type à l'aide d'un paramètre de type.
Par exemple, ce type Box a le paramètre de type a (écrit avec une lettre minuscule).
pub type Box(a) {
Box(a)
}
Le paramètre de type a est un espace réservé pour n'importe quel type, donc Box peut être utilisé avec des strings, des entiers ou tout autre type.
Box("Hello, Joe!") // The type is Box(String)
Box(42) // The type is Box(Int)
Un type peut prendre plusieurs paramètres de type en les séparant par des virgules.
pub type Pair(a, b) {
Pair(a, b)
}
On peut aussi utiliser des paramètres de type dans les arguments des fonctions.
Cette fonction prend une valeur de type a et appelle deux fois une fonction qui prend un a et renvoie 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)