یک array در F# مجموعهای تغییرپذیر از صفر یا چند مقدار با طولی ثابت است. یعنی وقتی آرایه ساخته شد، اندازهاش دیگر نمیتواند تغییر کند، اما مقادیرش میتوانند. همهی مقادیر یک آرایه باید از یک نوع باشند. آرایهها را میتوان به شکل زیر تعریف کرد:
let empty = [| |]
let emptyAlternative = Array.empty
let singleValue = [| 5 |]
let singleValueAlternative = Array.singleton 5
let threeValues = [| "a"; "b"; "c" |]
میتوان با استفاده از یک اندیس، عنصرها را به آرایه نسبت داد یا از آن بازیابی کرد. آرایههای F# از صفر شروع میشوند، یعنی اندیس اولین عنصر همیشه صفر است:
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)"
این یک زیرخط '_' باید هنگام تطبیق الگو همیشه آخرین مورد باشد؛ هر مقداری که با هیچکدام از حالتهای دیگر مطابقت نکند، با این حالت رسیدگی میشود.
شما پرندهشناسی پرشور هستید که پیگیری میکنید در هفت روز گذشته چند پرنده به باغتان آمده است.
شش کار در پیش دارید که همهشان به شمار پرندههایی مربوط میشوند که به باغتان آمدهاند.
برای مقایسه، همیشه نسخهای از شمارشهای هفتهی گذشته را کنار خود نگه میدارید که عبارت بودند از: 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
تابع dayWithoutBirds را پیادهسازی کنید که اگر روزی وجود داشته باشد که هیچ پرندهای در آن به باغ نیامده است، true را برمیگرداند؛ در غیر این صورت false را برمیگرداند:
dayWithoutBirds [| 3; 5; 0; 7; 4; 1 |]
// => true
تابع incrementTodaysCount را پیادهسازی کنید تا شمارش امروز را یک واحد افزایش دهد و شمارشهای بهروزشده را برگرداند:
let birdCount = [| 3; 5; 0; 7; 4; 1 |]
incrementTodaysCount birdCount
// => [| 3; 5; 0; 7; 4; 2 |]
در طول یک سال گذشته دریافتهاید که برخی هفتهها الگوهای غیرعادی یکسانی دارند:
تابع unusualWeek را پیادهسازی کنید که اگر الگوی شمارش پرندههای این هفته با یکی از الگوهای غیرعادی مطابقت داشته باشد، true را برمیگرداند:
unusualWeek [| 1; 0; 5; 0; 12; 0; 2 |]
// => true
unusualWeek [| 5; 0; 5; 12; 5; 3; 5|]
// => true
(توجه کنید که زوج یا فرد بودن روزها بر پایهی شمارهگذاری از ۱ است، نه از ۰؛ اولین عنصر آرایه مربوط به یک روز فرد است)