نفّذ عمليات المصفوفة الأساسية.
في اللغات الوظيفية، تُعدّ عمليات المصفوفات مثل length وmap وreduce شائعة جدًا.
نفّذ سلسلة من عمليات المصفوفة الأساسية، دون استخدام دوال موجودة.
يعتمد العدد الدقيق للعمليات المطلوب تنفيذها وأسماؤها على المسار، لتجنّب التعارض مع الأسماء الموجودة، لكن العمليات العامة التي ستنفّذها تشمل:
append (بإعطاء مصفوفتين، أضِف كل عناصر المصفوفة الثانية إلى نهاية المصفوفة الأولى)؛concatenate (بإعطاء سلسلة من المصفوفات، ادمج كل عناصر المصفوفات كلها في مصفوفة واحدة مسطّحة)؛filter (بإعطاء دالة شرطية ومصفوفة، أرجِع المصفوفة التي تضم كل العناصر التي يكون عندها predicate(item) صحيحًا)؛length (بإعطاء مصفوفة، أرجِع العدد الإجمالي للعناصر داخلها)؛map (بإعطاء دالة ومصفوفة، أرجِع مصفوفة نتائج تطبيق function(item) على كل العناصر)؛foldl (بإعطاء دالة ومصفوفة وقيمة مراكم ابتدائية، اطوِ (اختزل) كل عنصر في المراكم من اليسار)؛foldr (بإعطاء دالة ومصفوفة وقيمة مراكم ابتدائية، اطوِ (اختزل) كل عنصر في المراكم من اليمين)؛reverse (بإعطاء مصفوفة، أرجِع مصفوفة تضم كل العناصر الأصلية، لكن بترتيب معكوس).لاحظ أن ترتيب تمرير الوسائط إلى دالتي الطيّ (foldl وfoldr) مهم.
تنفيذ عمليات المصفوفة هذه دون استخدام أي دالة مدمجة شبه مستحيل في Roc، لأنك تحتاج إلى طريقة لإضافة عناصر إلى المصفوفة في نهايتها أو في بدايتها.
في لغات أخرى قد تستخدم عوامل مثل : في Haskell أو += في Python، لكن في Roc عليك استخدام دوال List.
لذا يُسمح لك في هذا التمرين باستخدام List.append (لكن تجنّب استخدام أي دالة مدمجة أخرى).
تستخدم许多 لغات البرمجة الوظيفية القوائم المترابطة كنوع المجموعة الأساسي.
إضافة عنصر في مقدمة قائمة مترابطة أو إخراج العنصر الأول منها أمر فعّال، لذا في تلك اللغات كنت ستنفّذ عمليات المصفوفة باستخدام List.prepend.
لكن في Roc، تكون List عبارة عن مصفوفة (كتلة متجاورة من البايتات).
تتمتع المصفوفات بخصائص تختلف عن القوائم المترابطة، مثل القدرة على الوصول إلى العناصر عبر الفهرس بكفاءة وإضافة عناصر جديدة.
ولهذا السبب، نستخدم في Roc الأمر List.append كثيرًا ونادرًا ما نستخدم List.prepend.
يستخدم Roc أسماء مختلفة قليلًا عن الأسماء المذكورة في التعليمات العامة:
concat بدلًا من append
join بدلًا من concatenate
len بدلًا من length
fold بدلًا من foldl
fold_rev بدلًا من foldr
لكن أسماء الدوال التالية قياسية في Roc:
filtermapreverseجرّب استخدام:
match list {
[] => ...
[first, .. as rest] => ...
}
أو
match list {
[] => ...
[.. as rest, last] => ...
}
سجّل في Exercism لتتعلّم وتتقن Roc عبر 126 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.
استمتع بمقدمة عملية إلى الاستدعاء الذاتي، واستكشف البدائل الأمرية والوظيفية لتمرين عمليات القوائم، وتعمّق في الاستدعاء الذاتي الذيلية ودوال المراكم.