リスト型
リストとはデータの集合のことで
F#のリストは、線形リストの一種である片方向リストです。
片方向リストは基本的なデータ構造の一つで、
一つ次の要素へのポインタを持つデータ構造です。
自分の要素と次の要素の場所を覚えておくだけのデータが連なってリストになっています。
リストの要素はすべて同じ型でなければなりません。
要素が全くないリストを空リストといい、[]で表します。
また、リストの要素は";"で区切ります。
リスト
> [];;
val it : 'a list = []
> [1];;
val it : int list = [1]
> [1;2;3;];;
val it : int list = [1; 2; 3]
> ["abc";"def";"ghi";];;
val it : string list = ["abc"; "def"; "ghi"]
//型が異なるデータは同じリストに入れられない
> [1;"abc"];;
[1;"abc"];;
---^^^^^^
stdin(5,4): error FS0001: This expression has type
string
but is here used with type
int.
リストの連結には::と@を用います。
::はリストの要素とリストを連結する演算子で
::の左側にリストの要素、::の右側にリストがきます。
::の左右に置くべき型が異なる点に注意してください。
リストと要素の連結
> 1::[];;
val it : int list = [1]
> 1::[2];;
val it : int list = [1; 2]
> 1::2::3::[];;
val it : int list = [1; 2; 3]
> 1::2::3::[4;5;6];;
val it : int list = [1; 2; 3; 4; 5; 6]
//これはエラー。[1]と2は型が異なる
> [1]::[2];;
[1]::[2];;
------^^
stdin(14,7): error FS0001: This expression has type
int
but is here used with type
int list.
//正しくはこう
> [1]::[[2]];;
val it : int list list = [[1]; [2]]
>
@のほうは、リストとリストの連結に用います。
リストとリストの連結
> [1;2] @ [3;4;5];;
val it : int list = [1; 2; 3; 4; 5]
> ["abc";"def"] @ ["ghi"];;
val it : string list = ["abc"; "def"; "ghi"]
> 1::[2;3] @ [4;5;6];;
val it : int list = [1; 2; 3; 4; 5; 6]
リストには、便利な略記法があります。
[開始インデックス..終了インデックス]で
開始インデックスから終了インデックスまでの数値からなるリストが生成されます。
また、[開始インデックス..増分..終了インデックス]で
開始インデックスから増分ずつ増えながら
終了インデックスより小さいあたいになるまでの数値からなるリストが作れます。
リストの略記法
> [1..10];;
val it : int list = [1; 2; 3; 4; 5; 6; 7; 8; 9; 10]
> [1..2..10];;
val it : int list = [1; 3; 5; 7; 9]
> [1..3..20];;
val it : int list = [1; 4; 7; 10; 13; 16; 19]
シーケンス式という記法を用いることで規則に沿ったリストを生成することができます。
シーケンス式自体は汎用的なものなのでこれについては別途解説予定です。
シーケンス式(リスト)
> [for i in 1..5 -> i*i];;
val it: int list = [1; 4; 9; 16; 25]
> [for i in 1..5 -> [for j in 1..3 -> i*j]];; //シーケンス式の入れ子
val it: int list list =
[[1; 2; 3]; [2; 4; 6]; [3; 6; 9]; [4; 8; 12]; [5; 10; 15]]