宝箱

宝箱

学習演習

はじめに

ジェネリクス

型パラメーターを使って、どんな型の値でも入れられる型を_ジェネリック型_といいます。

たとえば、この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ジェネリックカスタム型を定義する

1つのバリアントを持つTreasureChestカスタム型を定義します。

このバリアントには、関連するString値を持たせます。これは宝箱のパスワードを保存するために使われます。

また、このバリアントには関連するジェネリックな値も持たせます。宝物として何でも入れられるように、この値はジェネリックになっています。

2. UnlockResult型を定義する

2つのバリアントを持つUnlockResultカスタム型を定義します。

最初のバリアントはUnlockedで、宝物を保存するためのジェネリックな値を持ちます。

2番目のバリアントはWrongPasswordで、値を持ちません。

3. get_treasure関数を定義する

この関数は2つの仮引数を受け取ります。

  • TreasureChestジェネリックカスタム型
  • String(パスワードを試すため)

この関数は、渡されたパスワードの試行を、TreasureChest内のStringと照合します。

関数はUnlockResultを返します。

パスワードが一致した場合は、TreasureChestのジェネリックな値(宝物です!)を持つUnlockedを返します。

パスワードが一致しない場合は、WrongPasswordを返します。

GitHubで編集する リンクは新しいウィンドウまたはタブで開きます
Gleam Exercism

宝箱を始める準備はできましたか?

Exercismに登録すれば、33個のコンセプト122個の演習、そして本物の人間によるメンタリングとともに、Gleamを学んでマスターできます。すべて無料です。