型パラメーターを使って、どんな型の値でも入れられる型を_ジェネリック型_といいます。
たとえば、この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)
この演習では、宝物を保管するための、ジェネリックな(魔法のような!)TreasureChestを書いていきます。
1つのバリアントを持つTreasureChestカスタム型を定義します。
このバリアントには、関連するString値を持たせます。これは宝箱のパスワードを保存するために使われます。
また、このバリアントには関連するジェネリックな値も持たせます。宝物として何でも入れられるように、この値はジェネリックになっています。
2つのバリアントを持つUnlockResultカスタム型を定義します。
最初のバリアントはUnlockedで、宝物を保存するためのジェネリックな値を持ちます。
2番目のバリアントはWrongPasswordで、値を持ちません。
この関数は2つの仮引数を受け取ります。
TreasureChestジェネリックカスタム型String(パスワードを試すため)この関数は、渡されたパスワードの試行を、TreasureChest内のStringと照合します。
関数はUnlockResultを返します。
パスワードが一致した場合は、TreasureChestのジェネリックな値(宝物です!)を持つUnlockedを返します。
パスワードが一致しない場合は、WrongPasswordを返します。