ある型が、_型パラメータ_を使ってどんな型の値でも入れられるようになっているとき、その型を_ジェネリック型_といいます。
たとえば、次のBox型には型パラメータaがあります(小文字で書きます)。
pub type Box(a) {
Box(a)
}
型パラメータaは、どんな型にも当てはまるプレースホルダーなので、Boxは文字列や整数など、どんな型にも使えます。
Box("Hello, Joe!") // The type is Box(String)
Box(42) // The type is Box(Int)
型パラメータをカンマで区切れば、型に複数の型パラメータを持たせることもできます。
pub type Pair(a, b) {
Pair(a, b)
}
型パラメータは、関数の引数でも使うことができます。
この関数は型aの値を受け取り、aを受け取ってbを返す関数を2回呼び出します。
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)