Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

リスト

💡 お知らせ: このドキュメントはAIによって翻訳されています。表現に違和感がある場合は、原文(英語)を参照するか、翻訳にご協力ください。

List(リスト)は、Nil と書かれる空のリストか、 もしくは x :: xs と書かれる cons cell(コンスセル)のいずれかです。 ここで x は先頭の要素、xs はリストの残り(末尾)を表します。 List 型は多相的なので、整数のリスト(List[Int32] と書きます)や、 文字列のリスト(List[String] と書きます)を作ることができます。

空のリストは次のように書きます。

Nil

"Hello""World" という文字列を要素に持つ文字列のリストは、 次のように構築できます。

"Hello" :: "World" :: Nil

あるいは、次の記法を使うこともできます。

List#{"Hello", "World"}

リストに対しては、さまざまな便利な操作を行えます。

たとえば、リストの長さは次のように計算できます。

List.length(1 :: 2 :: 3 :: Nil)

リストの要素の順序を反転させることもできます。

List.reverse(1 :: 2 :: 3 :: Nil)

2 つのリストは、List.append 関数を使って次のように連結できます。

let xs = (1 :: 2 :: 3 :: Nil);
let ys = (4 :: 5 :: 6 :: Nil);
List.append(xs, ys)

あるいは、組み込みの連結演算子 ::: を使って次のように書くこともできます。

let xs = (1 :: 2 :: 3 :: Nil);
let ys = (4 :: 5 :: 6 :: Nil);
xs ::: ys

Flix には、リストを操作するための関数が豊富に用意されています。

以下は、よく使われるものの一部です。

List.count(x -> x == 1, 1 :: 2 :: 3 :: Nil);
List.filter(x -> x == 1, 1 :: 2 :: 3 :: Nil);
List.map(x -> x + 1, 1 :: 2 :: 3 :: Nil);
List.foldLeft((x, y) -> x + y, 0, 1 :: 2 :: 3 :: Nil)

さらに、少し変わった関数もあります。

List.intersperse("X", "a" :: "b" :: "c" :: Nil)

これは、リストのすべての要素の間に "X" を挿入します。

let l1 = "X" :: "Y" :: Nil;
let l2 = ("a" :: "b" :: Nil) :: ("c" :: "d" :: Nil) :: Nil;
List.intercalate(l1, l2)

これは、リスト l2 のすべての要素の間に、リスト l1 を挿入します。

リストを操作する再帰関数を、自分で書くこともできます。

たとえば、map 関数の実装は次のようになります。

///
/// `l` のすべての要素に `f` を適用した結果を返します。
/// すなわち、結果は `f(x1) :: f(x2) :: ...` という形になります。
///
pub def map(f: a -> b \ ef, l: List[a]): List[b] \ ef = match l {
    case Nil     => Nil
    case x :: xs => f(x) :: map(f, xs)
}