القدرة على تعريف شيء ما من خلال نفسه تُسمى العودية. في F#، تظهر العودية غالبًا في الدوال العودية، وهي دوال تستدعي نفسها.
تحتاج الدالة العودية إلى حالة أساسية واحدة على الأقل وإلى حالة عودية واحدة على الأقل. تُرجع حالة أساسية قيمة دون استدعاء الدالة مرة أخرى. تستدعي حالة عودية الدالة مرة أخرى، مع تعديل المدخل بحيث يطابق الحالة الأساسية في مرحلة ما.
تُعرَّف الدوال العودية مثل الدوال العادية، ولكن باستخدام المعدِّل rec. بدون هذا المعدِّل، لن تتمكن الدالة من استدعاء نفسها، وأي محاولة لفعل ذلك ستؤدي إلى خطأ في الترجمة. لذلك يجب اختيار العودية صراحةً.
let rec factorial x =
// Base case
if x = 1 then
1
// Recursive case
else
x * factorial (x - 1)
يدعم F# أيضًا الأنواع العودية من خلال أنواع الاتحاد المميز. النوع العودي من نوع الاتحاد المميز تكون فيه حالة واحدة أو أكثر من حالاته تشير إلى نوع الاتحاد المميز نفسه في بياناتها. مثل الدوال العودية، يجب أن يكون للأنواع العودية حالة أساسية. وعلى عكس الدوال العودية، لا تستخدم الأنواع العودية الكلمة المفتاحية rec.
type RussianDoll =
| Doll // Base case
| Layer of RussianDoll // Recursive case
في هذا التمرين، تعمل في مطعم بيتزا يوصل الطلبات إلى العملاء.
أنت تقدّم ثلاثة أنواع من البيتزا:
ويمكن للعملاء أيضًا اختيار خيارين إضافيين مقابل رسم إضافي بسيط:
عندما يقدّم العملاء طلبًا، تُضاف رسوم إضافية إذا طلبوا بيتزا واحدة أو بيتزتين فقط:
لديك ثلاث مهام، تتعامل كل واحدة منها مع البيتزا وسعرها.
عرّف الاتحاد المميّز Pizza لتمثيل أنواع البيتزا والخيارين الإضافيين اللذين يمكن إضافتهما إلى البيتزا:
MargheritaCapreseFormaggioExtraSauceExtraToppingsنفّذ الدالة pizzaPrice لحساب سعر البيتزا:
pizzaPrice Caprese
// => 9
نفّذ الدالة orderPrice لحساب سعر طلب البيتزا:
orderPrice [Margherita; Formaggio]
// => 19
سجّل في Exercism لتتعلّم وتتقن F# عبر 18 مفهومًا148 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.