استكشاف الوظائف

مكتمل

عادةً ما تجد نفسك في موقف تبدو فيه تعليمتك البرمجية متكررة. فهي تفعل الشيء نفسه في العديد من الأماكن، أو باختلافات طفيفة فقط. في مثل هذه الحالات، يجب البدء في التفكير في كيفية جعل التعليمات البرمجية قابلة لإعادة الاستخدام. الجواب على كيفية معالجة هذا الوضع هو استخراج هذه التعبيرات وكتابة دالة واحدة أو أكثر. الدالة لبنة أساسية في العديد من لغات الكمبيوتر بما فيهم #F.

دالة

الدالة مرجع مُسمى يحتوي على نص يتكون من تعبيرٍ واحد أو أكثر. ويمكن أيضاً أن يكون له معلمات. تبدأ الدالة بالكلمة الرئيسية let واسم الدالة. ثم هناك عامل تشغيل التعيين، وعلى يمين هذا العامل يوجد نص الدالة.

فيما يلي بناء جملة الدالة:

let <function name> <parameters> = <function body>

مثال فعلي على الدالة، كما يظهر في مثال بناء الجملة التالية، يبدو على النحو التالي:

let add a b = a + b 

في هذا المثال، اسم الدالة هو add والمعلمات هي a و b. يضيف نص الدالة المعلمتين معاً a+b وينتهي بإرجاع النتيجة.

القيم المرجعة

كما رأيت في المثال الأول، لم تكن هناك كلمة أساسية return لذكر ما يجري إرجاعه. في #F، ما يوجد على السطر الأخير من أحد الدوال هو ما يجري إرجاعه. انظر إلى هذه الدالة متعددة السطور أدناه:

let addAndMultiply a b c = 
    let sum = a + b
    let product = sum * c
    product

بوضع product على السطر الأخير، سيكون هذا ما يجري إرجاعه. إذن كيف تسمي دالة كهذه؟

استدعاء دالة

لتسمية الدالة أو استدعائها، استخدم اسم الدالة وأضف أي معلمات ترغب في استخدامها مفصولةً بحرف المسافة. على سبيل المثال، لاستدعاء الدالة addAndMultiply() أدخل التعليمات البرمجية التالية:

addAndMultiply 2 3 3 // 15

لمشاهدة نتائج الدالة، يمكنك إما تعيينها إلى متغير أو طباعتها مباشرةً كما يلي:

let sum = addAndMultiply 2 3 3
printfn "%i" sum
// OR
printfn "%i" (addAndMultiply 2 3 3)

أنواع مستنتجة

دعونا نأخذ التعليمات البرمجية التالية:

let add a b = a + b
let sum = add 2 2 
let concat = add "hello" "world" // will give compilation error

ستفشل هذه التعليمات البرمجية على السطر الأخير مع الرسالة التالية:

error FS0001: This expression was expected to have type
    'int'    
but here has type
    'string'    

سبب الفشل هو أن F# بالفعل حدد نوع المعلمة التي يجب استخدامها، وقرر أنه عدد صحيح. السبب الذي جعله يقرر أنه عدد صحيح هو المعلومات في الصف الثاني،let sum = add 2 2. تم استخدام الدالة add() بطريقة تنص على أن نوع المعلمة كان بالتأكيد عددًا صحيحًا.

إذا لم يكن الصف الثاني موجودًا، تعمل التعليمات البرمجية الخاصة بك:

let add a b = a + b
// let sum = add 2 2 
let concat = add "hello" "world" // will work

يرى المحول البرمجي أن أول استخدام للدالة يتم باستخدام سلاسل ويخلص إلى أن نوع المعلمة هو سلسلة. لذلك، يستنتج السياق أولا النوع.

أنواع صريحة

هناك مواقف تريد أن تكون فيها صريحًا، سواء حول نوع المعلمات التي يجب اتخاذها وما ترجع إليه الوظيفة. هذا يساعد على أن تكون القراءة محددة، على الرغم من أن المحول البرمجي لا يحتاج إليها على الأرجح.

خذ الدالة التالية على سبيل المثال:

let convert a =
    int a

لإضافة أنواع إليها، يمكنك إضافة :<type>، على النحو التالي:

let convert (a:string) =
    int a

المعلمة الآن لديها النوع string عبر هذه التعليمة البرمجية let convert (a:string). يمكنك الآن أن تكون أكثر وضوحا، بإضافة نوع إرجاع. للقيام بذلك، أضف حق آخر :<type> بعد المعلمة:

let convert (a:string) :int =
    int a

الآن تقوم الأقواس بإحاطة المعلمة، كما هو موضح في (a:string). نوع الإرجاع هو آخر :<type> تعليق توضيحي يحدث، وهو :int. F# لديه ذكاء كافي لمعرفة معظم السيناريوهات، ولكن قد يحتاج المساعدة في بعض الأحيان بجعل التعليمات البرمجية أكثر وضوحا. ويوجد فائدة أخرى لإضافة الأنواع تتمثل في أنه يسهل على مطور آخر اكتشاف ما يحدث.