Elm-リスト
リスト、タプル、およびレコードのデータ構造を使用して、値のコレクションを格納できます。
この章では、Elmでリストを使用する方法について説明します。
リストは同種の値のコレクションです。リスト内の値はすべて同じデータ型である必要があります。
変数を使用して値を格納するときは、次の制限を考慮してください。
変数は本質的にスカラーです。つまり、宣言時に変数が保持できる値は1つだけです。これは、プログラムにn個の値を格納するには、n個の変数宣言が必要になることを意味します。したがって、より多くの値のコレクションを格納する必要がある場合、変数の使用は実行できません。
プログラム内の変数にはランダムな順序でメモリが割り当てられるため、宣言された順序で値を取得/読み取ることが困難になります。
構文
List_name = [value1,value2,value3.....valuen]
図
次の例は、Elmでリストを使用する方法を示しています。elmREPLでこの例を試してください-
> myList1 = [10,20,30]
[10,20,30] : List number
> myList2 = ["hello","world"]
["hello","world"] : List String
異なる型の値をリストに追加しようとすると、コンパイラーは型の不一致エラーをスローします。これを以下に示します。
> myList = [1,"hello"]
-- TYPE MISMATCH
---------------------------------------------
repl-temp-000.elm
The 1st and 2nd entries in this list are different types of values.
4| [1,"hello"]
^^^^^^^
The 1st entry has this type:
number
But the 2nd is:
String
リスト操作
次の表は、リストでの一般的な操作を示しています-
シニアいいえ | 方法 | 説明 |
---|---|---|
1 | isEmpty:リストa-> Bool | リストが空かどうかをチェックします |
2 | 逆:リストa->ブール | 入力リストを逆にします |
3 | 長さ:リストa-> Int | リストのサイズを返します |
4 | 最大:リスト比較可能->多分。多分比較可能 | 最大値を返します |
5 | 最小:比較可能なリスト->多分。多分比較可能 | 最小値を返します |
6 | 合計:リスト番号->番号 | リスト内のすべての要素の合計を返します |
7 | 製品:リスト番号->番号 | リストが空かどうかをチェックします |
8 | ソート:比較可能なリスト->比較可能なリスト | リストを昇順で並べ替えます |
9 | concat:リスト(リストa)->リストa | たくさんのリストを1つにマージします |
10 | 追加:リストa->リストa->リストa | 2つのリストをマージします |
11 | 範囲:Int-> Int-> List Int | 最初から最後までの数値のリストを返します |
12 | フィルタ:(a-> Bool)->リストa->リストa | 入力リストから値のリストをフィルタリングします |
13 | 頭:リストa->たぶん。たぶんa | リストから最初の要素を返します |
14 | テール::リストa->多分。多分(リストa) | 頭を除くすべての要素を返します |
isEmpty
リストが空の場合、この関数はtrueを返します。
構文
List.isEmpty list_name
関数のシグネチャを確認するには、elmREPL-に次のように入力します。
> List.isEmpty
<function> : List a -> Bool
図
> List.isEmpty
<function> : List a -> Bool
> List.isEmpty [10,20,30]
False : Bool
逆行する
この関数はリストを逆にします。
構文
List.reverse list_name
関数のシグネチャを確認するには、elmREPL-に次のように入力します。
> List.reverse
<function> : List a -> List a
図
> List.reverse [10,20,30]
[30,20,10] : List number
長さ
この関数は、リストの長さを返します。
構文
List.length list_name
関数のシグネチャを確認するには、elmREPL-に次のように入力します。
> List.length
<function> : List a -> Int
図
> List.length [10,20,30]
3 : Int
最大
この関数は、空でないリストの最大要素を返します。
構文
List.maximum list_name
関数のシグネチャを確認するには、elmREPL-に次のように入力します。
> List.maximum
<function> : List comparable -> Maybe.Maybe comparable
図
> List.maximum [10,20,30]
Just 30 : Maybe.Maybe number
> List.maximum []
Nothing : Maybe.Maybe comparable
最小
この関数は、空でないリストの最小要素を返します。
構文
List.minimum list_name
関数のシグネチャを確認するには、elmREPL-に次のように入力します。
> List.minimum
<function> : List comparable -> Maybe.Maybe comparable
図
> List.minimum [10,20,30]
Just 10 : Maybe.Maybe number
和
この関数は、リスト内のすべての要素の合計を返します。
構文
List.sum list_name
関数のシグネチャを確認するには、elmREPL-に次のように入力します。
> List.sum
<function> : List number -> number
図
> List.sum [10,20,30]
60 : number
製品
この関数は、リスト内のすべての要素の積を返します。
構文
List.product list_name
関数のシグネチャを確認するには、elmREPL-に次のように入力します。
<function> : List number -> number
図
List.product [10,20,30]
6000 : number
ソート
この関数は、リスト内の値を最低から最高にソートします。
構文
List.sort list_name
関数のシグネチャを確認するには、elmREPL-に次のように入力します。
> List.sort
<function> : List comparable -> List comparable
図
> List.sort [10,20,30]
[10,20,30] : List number
concat
この関数は、一連のリストを1つのリストに連結します。
構文
List.concat [ [list_name1],[list_name2],[list_name3],.....[list_nameN] ]
関数のシグネチャを確認するには、elmREPL-に次のように入力します。
> List.concat
<function> : List (List a) -> List a
図
> List.concat [[10,20], [30,40],[50,60]]
[10,20,30,40,50,60] : List number
追加
この関数は、2つのリストをまとめます。
構文
List.append [list_name1] [list_name2]
関数のシグネチャを確認するには、elmREPL-に次のように入力します。
> List.append
<function> : List a -> List a -> List a
図
> List.append [10,20] [30,40]
[10,20,30,40] : List number
++演算子を使用して、リストを別のリストに追加することもできます。これを以下の例に示します-
> [10.1,20.2] ++ [30.3,40.4]
[10.1,20.2,30.3,40.4] : List Float
範囲
この関数は、すべての要素が1ずつ増える番号のリストを作成します。リストに含まれるべき最小数と最大数が関数に渡されます。
構文
List.range start_range end_range
関数のシグネチャを確認するには、elmREPL-に次のように入力します。
> List.range
<function> : Int -> Int -> List Int
図
> List.range 1 10
[1,2,3,4,5,6,7,8,9,10] : List Int
フィルタ
この関数は、入力リストから値のセットをフィルタリングします。テストに合格した値のみを保持します。
構文
List.filter test_function input_list
関数のシグネチャを確認するには、elmREPL-に次のように入力します。
> List.filter
<function> : (a -> Bool) -> List a -> List a
図
次の例では、入力リストからすべての偶数をフィルタリングします
> List.filter (\n -> n%2==0) [10,20,30,55]
[10,20,30] : List Int
頭
この関数は、入力リストから最初の要素を返します。
構文
List.head input_list
関数のシグネチャを確認するには、elmREPL-に次のように入力します。
> List.head
<function> : List a -> Maybe.Maybe a
図
> List.head [10,20,30,40]
Just 10 : Maybe.Maybe number
> List.head []
Nothing : Maybe.Maybe a
尾
この関数は、リストの最初以降のすべての要素を返します。
構文
List.tail input_list
関数のシグネチャを確認するには、elmREPL-に次のように入力します。
> List.tail
<function> : List a -> Maybe.Maybe (List a)
図
> List.tail [10,20,30,40,50]
Just [20,30,40,50] : Maybe.Maybe (List number)
> List.tail [10]
Just [] : Maybe.Maybe (List number)
> List.tail []
Nothing : Maybe.Maybe (List a)
短所演算子の使用
短所演算子(::)は、リストの先頭に要素を追加します。
図
> 10::[20,30,40,50]
[10,20,30,40,50] : List number
追加する新しい要素とリスト内の値のデータ型は一致する必要があります。データ型が一致しない場合、コンパイラはエラーをスローします。
> [1,2,3,4]::[5,6,7,8]
-- TYPE MISMATCH ---------------------------------
------------ repl-temp-000.elm
The right side of (::) is causing a type mismatch.
3| [1,2,3,4]::[5,6,7,8]
^^^^^^^^^
(::) is expecting the right side to be a:
List (List number)
But the right side is:
List number
Hint: With operators like (::) I always check the left side first. If it seems fine,
I assume it is correct and check the right side. So the
problem may be in how the left and right arguments interact.
リストは不変です
Elmでリストが不変かどうかを確認しましょう。値1と連結された最初のリストmyListは、新しいリストを作成し、myListCopyに返されます。したがって、初期リストを表示しても、その値は変更されません。
> myList = [10,20,30]
[10,20,30] : List number
> myListCopy = 1::myList
[1,10,20,30] : List number
> myList
[10,20,30] : List number
>myList == myListCopy
False : Bool