F#のarrayは、長さが固定された、0個以上の値を保持する変更可能なコレクションです。つまり、一度配列を作成すると、そのサイズは変更できませんが、値は変更できます。配列内の値はすべて同じ型でなければなりません。配列は次のように定義できます:
let empty = [| |]
let emptyAlternative = Array.empty
let singleValue = [| 5 |]
let singleValueAlternative = Array.singleton 5
let threeValues = [| "a"; "b"; "c" |]
要素は、インデックスを使って配列に代入したり、配列から取得したりできます。F#の配列は0から始まるため、最初の要素のインデックスは常に0です:
let numbers = [| 2; 3; 5 |]
// Update value in array
numbers[2] <- 9
// Read value from array
numbers[2]
// => 9
配列は、Arrayモジュールで定義された関数や演算子を使って操作するか、_配列_パターンを使ったパターンマッチングで手動で操作します:
let describe array =
match array with
| [| |] -> "Empty"
| [| 1; 2; three |] -> sprintf "1, 2, %d" three
| _ -> "Other"
describe [| |] // => "Empty"
describe [| 1; 2; 4 |] // => "1, 2, 4"
describe [| 5; 7; 9 |] // => "Other"
パターンマッチングの際に値を_破棄_することもできます。特定のケースで値を_気にしない_場合(つまり、値を_使用_しない場合)は、アンダースコア('_')を使ってこれを表すことができます:
let describe array =
match array with
| [| |] -> "Empty array"
| [| x |] -> "Array with one item"
| [| _; y |] -> "Array with two items (first item ignored)"
| _ -> "Array with many items (all items ignored)"
describe [| |] // => "Empty array"
describe [| 1 |] // => "Array with one item"
describe [| 5; 7 |] // => "Array with two items (first item ignored)"
describe [| 5; 7; 9 |] // => "Array with many items (all items ignored)"
単一の'_'は、パターンマッチングの際に常に_最後_に来る必要があります。他のどのケースにも_一致しない_値はすべて、このケースで処理されます。
熱心なバードウォッチャーとして、過去7日間に庭に何羽の鳥が訪れたかを記録しています。
取り組むタスクは6つあり、どれも庭に訪れた鳥の数に関するものです。
比較のために、先週の数をいつも手元に控えています。先週の数は、0、2、5、3、7、8、4でした。先週の数を保持するlastWeekという束縛を定義してください:
lastWeek
// => [| 0; 2; 5; 3; 7; 8; 4 |]
yesterday関数を実装して、昨日庭に訪れた鳥の数を返すようにしてください。鳥の数は日付の順に並んでいて、最初の要素が最も古い日の数、最後の要素が今日の数です。
yesterday [| 3; 5; 0; 7; 4; 1 |]
// => 4
total関数を実装して、庭に訪れた鳥の合計数を返すようにしてください:
total [| 3; 5; 0; 7; 4; 1 |]
// => 20
庭に訪れた鳥が0羽だった日があればtrueを返し、そうでなければfalseを返すdayWithoutBirds関数を実装してください:
dayWithoutBirds [| 3; 5; 0; 7; 4; 1 |]
// => true
incrementTodaysCount関数を実装して、今日の数を1増やし、更新後の数を返すようにしてください:
let birdCount = [| 3; 5; 0; 7; 4; 1 |]
incrementTodaysCount birdCount
// => [| 3; 5; 0; 7; 4; 2 |]
この1年間で、いくつかの週には同じいつもと違うパターンがあることに気づきました:
今週の鳥の数のパターンが、こうしたパターンのいずれかに一致する場合にtrueを返すunusualWeek関数を実装してください:
unusualWeek [| 1; 0; 5; 0; 12; 0; 2 |]
// => true
unusualWeek [| 5; 0; 5; 12; 5; 3; 5|]
// => true
(日の偶奇は0始まりではなく1始まりであることに注意してください。配列の最初の要素は奇数番目の日に対応します)