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
(لاحظ أن زوجية الأيام مفهرسة بدءًا من 1، وليس من 0؛ فأول عنصر في المصفوفة يقابل يومًا فرديًا)
سجّل في Exercism لتتعلّم وتتقن F# عبر 18 مفهومًا148 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.