配列型
配列とはデータの集合のことです。
その意味ではリストに似ていますが
添え字(インデックス)を用いてデータにアクセス出来る点がリストと異なります。
またリストと同じく、配列の中身の型は同じでなければなりません。
配列は、固定のサイズの要素を順番に並べているのでリストのように
次の要素の場所を知らなくとも要素数*要素サイズで任意の位置にアクセスできます。
配列は要素を[| |]で囲って表します。
また要素は、リストと同じく";"で区切ります。
配列
> [| |];;
val it : 'a array = [||]
> [|1;2;3|];;
val it : int array = [|1; 2; 3|]
> [|"abc";"def";"ghi"|];;
val it : string array = [|"abc"; "def"; "ghi"|]
F#6.0からは配列の要素は[インデックス]で参照します。
以前のf#では.[1]という風にドットとインデックスでアクセスしていましたが、この記法もまだ使えるようです。
一つ目の要素のインデックスは0から始まります。
なので例えば要素数が3の場合は0,1,2と2が最後の要素になります。
要素のないインデックスを参照すると例外が発生します。
例外については後の節で説明します。
配列の要素の参照
> let array1 = [|1;2;3;4;5|] in array1[0];;
val it : int = 1
> let array1 = [|1;2;3;4;5|] in array1.[0];; //古い記法
val it : int = 1
> let array1 = [|1;2;3;4;5|] in array1[3];;
val it : int = 4
> let array1 = [|1;2;3;4;5|] in array1.[6];;
System.IndexOutOfRangeException: インデックスが配列の境界外です。
場所 <StartupCode$FSI_0019>.$FSI_0019._main()
stopped due to error
//あまり意味はないですが、こんな書き方も出来ます
> [|1;2;3;|][2];;
val it : int = 3
配列の要素を行ごとに配置することもでき、その場合セミコロンを省略できます。
配列にも、リストと同様の略記法が使用できます。
配列の略記
> [|1..10|];;
val it : int array = [|1; 2; 3; 4; 5; 6; 7; 8; 9; 10|]
> [|1..2..10|];;
val it : int array = [|1; 3; 5; 7; 9|]
> [|1..3..20|];;
val it : int array = [|1; 4; 7; 10; 13; 16; 19|]
リスト同様シーケンス式を用いて配列を作成することもできます。
シーケンス式(配列)
> [|for i in 1..10 -> i*i|];; //配列のシーケンス式
val it: int[] = [|1; 4; 9; 16; 25; 36; 49; 64; 81; 100|]
> [for i in 1..10 -> i*i];; //参考までにリスト版。違いを比べてみてください
val it: int list = [1; 4; 9; 16; 25; 36; 49; 64; 81; 100]
ドット表記を用いて配列のスライスを作ることもできます。
配列のスライスというのは配列の部分配列のことです。
シーケンス式(配列)
> let ar2 = [|for i in 1..10 -> i*i|];;
val ar2: int[] = [|1; 4; 9; 16; 25; 36; 49; 64; 81; 100|]
> ar2[..5];; //先頭から6番目まで
val it: int[] = [|1; 4; 9; 16; 25; 36|]
> ar2[5..];; //6番目から末尾まで
val it: int[] = [|36; 49; 64; 81; 100|]
> ar2[5..8];; //6番目から9番目まで
val it: int[] = [|36; 49; 64; 81|]