list في F# مجموعة غير قابلة للتغيير تتكوّن من صفر أو أكثر من القيم. ويجب أن تكون جميع القيم في المصفوفة من النوع نفسه. ولأن المصفوفات غير قابلة للتغيير، فبمجرد إنشاء المصفوفة لا يمكن أن تتغيّر قيمتها أبدًا. وأي دوال أو عوامل تبدو وكأنها تعدّل المصفوفة (مثل إضافة عنصر) ستُرجع في الواقع مصفوفة جديدة.
يمكن تعريف المصفوفات على النحو التالي:
let empty = []
let singleValue = [5]
let threeValues = ["a"; "b"; "c"]
الأسلوب الأكثر شيوعًا لإضافة عنصر إلى مصفوفة هو استخدام المعامل :: (cons):
let twoToFour = [2; 3; 4]
let oneToFour = 1 :: twoToFour
// => [1; 2; 3; 4]
تحتوي المصفوفة في F# على رأس (العنصر الأول) و_ذيل_ (كل ما يأتي بعد العنصر الأول). وذيل المصفوفة هو بذاته مصفوفة.
يتم التعامل مع المصفوفات إما عبر دوال وعوامل معرّفة في وحدة List، أو يدويًا باستخدام مطابقة الأنماط عبر نمطي list و_cons_:
let describe list =
match list with
| [] -> "Empty list"
| head::tail -> sprintf "Non-empty list with head: %d" head
describe [] // => "Empty list"
describe [1] // => "Non-empty with head: 1"
describe [5; 7; 9] // => "Non-empty with head: 5"
يمكنك أيضًا تجاهل قيمة عند مطابقة الأنماط؛ فعندما لا تهتم بقيمة ما في حالة معيّنة (أي أنك لن تستخدم القيمة) يمكنك استخدام شرطة سفلية ('_') للدلالة على ذلك:
let describe list =
match list with
| [] -> "Empty list"
| [x] -> "List with one item"
| [_; y] -> "List with two items (first item ignored)"
| _ -> "List with many items (all items ignored)"
describe [] // => "Empty list"
describe [1] // => "List with one item"
describe [5; 7] // => "List with two items (first item ignored)"
describe [5; 7; 9] // => "List with many items (all items ignored)"
ينبغي أن تأتي '_' المفردة دائمًا أخيرًا عند مطابقة الأنماط، فكل قيمة لا تطابق أيًّا من الحالات الأخرى ستُعالَج بواسطة هذه الحالة.
في هذا التمرين ستكتب كودًا لتتبّع مصفوفة من لغات البرمجة التي تريد تعلّمها على Exercism.
لديك ست مهام، وكلها ستتضمن التعامل مع المصفوفات.
لتتبّع اللغات التي تريد تعلّمها، ستحتاج إلى إنشاء مصفوفة جديدة. عرّف الارتباط newList الذي يحتوي على مصفوفة جديدة فارغة.
newList
// => []
حاليًا، لديك ورقة مكتوب عليها اللغات التي تريد تعلّمها: F# وClojure وHaskell. عرّف الارتباط existingList ليمثّل هذه المصفوفة.
existingList
// => ["F#"; "Clojure"; "Haskell"]
بينما تستكشف Exercism وتجد لغات أكثر إثارة للاهتمام، تريد إضافتها إلى مصفوفتك. نفّذ الدالة addLanguage لإضافة لغة جديدة إلى بداية مصفوفتك.
addLanguage "TypeScript" ["JavaScript"; "CoffeeScript"]
// => ["TypeScript"; "JavaScript"; "CoffeeScript"]
عدّ اللغات واحدة واحدة غير مريح. نفّذ الدالة countLanguages لعدّ عدد اللغات في مصفوفتك.
countLanguages ["C#"; "Racket"; "Rust"; "Ruby"]
// => 4
في مرحلة ما، تدرك أن مصفوفتك مرتّبة بالعكس في الواقع! نفّذ الدالة reverseList لعكس مصفوفتك.
reverseList ["Prolog"; "C"; "Idris"; "Assembly"]
// => ["Assembly"; "Idris"; "C"; "Prolog"]
مع أنك تحب جميع اللغات، فإن F# له مكانة خاصة في قلبك. لذلك، تتحمس كثيرًا لمصفوفة من اللغات إذا:
نفّذ الدالة excitingList للتحقق مما إذا كانت مصفوفة من اللغات مثيرة:
excitingList ["Nim"; "F#"]
// => true
سجّل في Exercism لتتعلّم وتتقن F# عبر 18 مفهومًا148 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.