トラック
/
Gleam
Gleam
/
演習
/
Tracks on Tracks on Tracks
Tracks on Tracks on Tracks

Tracks on Tracks on Tracks

学習演習

はじめに

配列

Gleamの配列は、0個以上の値からなる不変のコレクションです。配列に入る値は、すべて同じ型でなければなりません。配列は不変なので、一度作成した配列の値が後から変わることはありません。配列を変更しているように見える関数や演算子(要素の追加など)も、実際には新しい配列を返します。

配列は次のように定義します。

let empty = []
let singleValue = [5]
let threeValues = ["a", "b", "c"]

配列に要素を追加する最も一般的な方法は、スプレッド構文を使うことです。

let two_to_four = [2, 3, 4]
let one_to_four = [1, ..two_to_four]
// -> [1, 2, 3, 4]

Gleamの標準ライブラリにあるgleam/listモジュールには、配列を扱うための便利な関数がたくさん用意されています。このモジュールはGleamのコードで非常によく使われるので、慣れておくとよいでしょう。

配列パターンを使うと、case式で配列にマッチさせ、含まれている値を変数に代入できます。

pub fn describe(list: List(String)) -> String {
  case list {
    [] -> "Empty list"
    [x] -> "List with one item: " <> x
    [x, y] -> "List with two items: " <> x <> " and " <> y
    _ -> "List with three or more items"
  }
}

長さが正確に一致する配列にマッチさせるだけでなく、スプレッド構文を使えば、少なくとも一定の長さ以上ある配列にもマッチさせられます。

pub fn describe(list: List(String)) -> String {
  case list {
    [_, _, ..] -> "List with at least two items"
    [_] -> "List with one item"
    [] -> "Empty list"
  }
}

スプレッド構文は、配列の残りの部分を変数に代入するのにも使えます。

pub fn remove_first_item(list: List(String)) -> List(String) {
  case list {
    // Return the list without the first item
    [_, ..rest] -> rest

    // There's no first item to remove, return an empty list
    _ -> []
  }
}

case式では、マッチ対象の型が取りうるすべての値に対してパターンを用意する必要があります。そのため、残りの値を処理するために、最後に破棄パターン(_)がよく使われます。

説明

この演習では、Exercismで学びたいプログラミング言語の配列を管理するコードを書きます。

タスクは6つあり、どれも配列を扱います。

1. 新しい配列を作成する

学びたい言語を管理するには、新しい配列を作成する必要があります。新しい空の配列を返すnew_list関数を定義しましょう。

new_list()
// -> []

2. 既存の配列を定義する

今、学びたい言語を書き出した紙があります。Gleam、Go、TypeScriptです。この配列を返すexisting_list関数を定義しましょう。

existing_list()
// -> ["Gleam", "Go", "TypeScript"]

3. 配列に新しい言語を追加する

Exercismを見て回るうちに、もっと面白い言語が見つかります。そうした言語は配列に追加したくなります。配列の先頭に新しい言語を追加するadd_language関数を実装しましょう。

add_language(["OCaml", "Elixir"], "Scheme")
// -> ["Scheme", "OCaml", "Elixir"]

4. 配列にある言語の数を数える

言語を1つずつ数えるのは面倒です。配列にある言語の数を数えるcount_languages関数を実装しましょう。

count_languages(["jq", "Elm", "Rust", "Kotlin"])
// -> 4

5. 配列を逆順にする

あるとき、配列の順番が実は逆になっていることに気づきます! 配列を逆順にするreverse_list関数を実装しましょう。

reverse_list(["Python", "Julia", "Idris", "COBOL"])
// -> ["COBOL", "Idris", "Julia", "Python"]

6. 配列がわくわくするものかどうかをチェックする

どの言語も大好きですが、Gleamは心の中で特別な位置を占めています。それだけに、次の条件を満たす言語の配列には、とてもわくわくします。

  • 配列の先頭がGleamです。
  • 配列の2番目の項目がGleamで、しかも配列に含まれる言語が2つか3つです。

言語の配列がわくわくするものかどうかをチェックするexciting_list関数を実装しましょう。

exciting_list(["Lua", "Gleam"])
// -> True
GitHubで編集する リンクは新しいウィンドウまたはタブで開きます
Gleam Exercism

Tracks on Tracks on Tracksを始める準備はできましたか?

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