الدالات (F#)

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

تعريف الدالات باستخدام letكلمة أساسية، أو، إذا كان دالة هو متداخلة، let recتركيبة الكلمة الأساسية.

// Non-recursive function definition.
let [inline] function-name parameter-list [ : return-type ] = function-body
// Recursive function definition.
let rec function-name parameter-list = recursive-function-body

ملاحظات

function-nameهو معرّف الذي يمثل دالة. parameter-listيتكون من المعلمات المتتابعة التي تفصل بواسطة المسافات. يمكنك تحديد نوع صريح لكل معلمة، كما هو موضح في قسم "المعلمات". إذا لم تحدد نوع وسيطة محددة، ستحاول المحول البرمجي إلى الاستدلال النوع من النص الأساسي للدالة. function-bodyيتكون من تعبير. عادة ما يكون هو التعبير الذي ينشئ نص دالة تعبير مركبة تتكون من عدد من التعبيرات التي culminate في تعبير نهائي هو القيمة المرجعة. return-typeهو علامة نقطتين متبوعة بنوع و هو اختيارية. إذا لم تحدد النوع القيمة المرجعة بشكل صريح، المحول البرمجي يحدد نوع الإرجاع من تعبير النهائية.

A simple دالة تعريف resembles the following:

let f x = x + 1

في المثال السابق، هو اسم الدالة f، تكون الوسيطة x، الذي يحتوي على نوع int، ونص دالة x + 1، و القيمة المرجعة من نوع int.

The موضعي المحدد هو a hint إلى the compiler that the دالة هو مربع متوسط و that the تعليمات برمجية for the دالة can be integrated في the النص الأساسي of the caller.

النطاق

على أي مستوى من مجال مختلف عن نطاق الوحدة النمطية، هو ليس خطأ لإعادة استخدام اسم قيمة أو دالة. If you reuse a اسم, the اسم declared later الظلال the اسم declared earlier. However, at the الأعلى المستوى نطاق في a وحدة نمطية?, أسماء must be فريد. For مثال, the following تعليمات برمجية produces an خطأ when it appears at وحدة نمطية? نطاق, but not when it appears inside a دالة:

let list1 = [ 1; 2; 3]
// Error: duplicate definition.
let list1 = []  
let function1 =
   let list1 = [1; 2; 3]
   let list1 = []
   list1

But the following تعليمات برمجية هو acceptable at أي المستوى of نطاق:

let list1 = [ 1; 2; 3]
let sumPlus x =
// OK: inner list1 hides the outer list1.
   let list1 = [1; 5; 10]  
   x + List.sum list1

المعلمات

أسماء of معلمات are listed بعد the دالة اسم. You can specify a نوع for a معلمة, كـ shown في the following مثال:

let (x : int) = x + 1

If you specify a نوع, it follows the اسم of the معلمة و هو separated من the اسم بواسطة a colon. If you omit the نوع for the معلمة, the معلمة نوع هو inferred بواسطة the compiler. For مثال, في the following دالة تعريف, the وسيطة x هو inferred إلى be of نوع int because 1 هو of نوع int.

let f x = x + 1

However, the compiler will attempt إلى make the دالة كـ generic كـ possible. على سبيل المثال، انظر إلى التعليمات البرمجية التالية:

let f x = (x, x)

The دالة creates a tuple من واحد وسيطة of أي نوع. Because the نوع ليس specified, the دالة can be used مع أي وسيطة نوع. لمزيد من المعلومات، راجع تعميم تلقائي (F#).

دالة Bodies

A دالة النص الأساسي can contain ملفات تعريف of محلي متغيرات و دالات. Such متغيرات و دالات are في نطاق في the النص الأساسي of the الحالي دالة but not outside it. When you have the lightweight بناء الجملة خيار ممكّن, you must استخدم مسافة بادئة إلى indicate that a تعريف هو في a دالة النص الأساسي, كـ shown في the following مثال:

let cylinderVolume radius length =
    // Define a local value pi.
    let pi = 3.14159
    length * pi * radius * radius

للمزيد من المعلومات، راجع تنسيق التعليمات البرمجية الإرشادات (F#) ومطول بناء الجملة (F#).

قيمة الإرجاع

المحول البرمجي يستخدم التعبير النهائي في النص أساسي لدالة لتحديد القيمة المرجعة والنوع. The compiler might infer the نوع of the final تعبير من السابق expressions. في the دالة cylinderVolume, shown في the السابق مقطع, the نوع of pi هو determined من the نوع of the قيمة حرفية 3.14159 إلى be float. The compiler uses the نوع of pi إلى determine the نوع of the تعبير h * pi * r * r إلى be float. Therefore, the overall return نوع of the دالة هو float.

إلى specify the return القيمة بوضوح, write the تعليمات برمجية كـ follows:


let cylinderVolume radius length : float =
   // Define a local value pi.
   let pi = 3.14159
   length * pi * radius * radius

كـ the تعليمات برمجية هو written above, the compiler applies float إلى the entire دالة; if you mean إلى يطبق it إلى the معلمة أنواع كـ well, استخدم the following تعليمات برمجية:

let cylinderVolume (radius : float) (length : float) : float

Calling a دالة

You يتصل دالات بواسطة specifying the دالة اسم followed بواسطة a مسافة و then أي الوسيطات separated بواسطة مسافات. على سبيل المثال، لإجراء مكالمة دالة cylinderVolumeوتعيين النتيجة إلى القيمة vol، تقوم بكتابة ما يلي تعليمات برمجية:

let vol = cylinderVolume 2.0 3.0

تطبيق جزئي ل الوسيطات

إذا قمت بكتابة عدد أقل من عدد معين من الوسيطات، يمكنك إنشاء دالة جديدة التي تتوقع الوسيطات المتبقية. Th هو أسلوب معالجة الوسيطات هو يشار إليها currying و هو characterهوtic لغات البرمجة الوظيفية مثل F#. ل مثال، هب أن تعمل مع أحجام الثاني من توجيه الإخراج: واحد يحتوي RADIUS 2.0و غير ذلك له RADIUS 3.0. يمكنك إنشاء الدالات التي تحدد حجم توجيه الإخراج كـ التالي:

let smallPipeRadius = 2.0
let bigPipeRadius = 3.0

// These define functions that take the length as a remaining
// argument:

let smallPipeVolume = cylinderVolume smallPipeRadius
let bigPipeVolume = cylinderVolume bigPipeRadius

هل ثم استخدام وسيطة إضافى كـ المطلوبة لمختلف أطوال أنابيب ذات أحجام مختلفة الثاني:

let length1 = 30.0
let length2 = 40.0
let smallPipeVol1 = smallPipeVolume length1
let smallPipeVol2 = smallPipeVolume length2
let bigPipeVol1 = bigPipeVolume length1
let bigPipeVol2 = bigPipeVolume length2

دالات عودى

دالات عودى هي الدالات التي يتصل نفسها. أنها تتطلب تحديد recكلمة أساسية التالية letكلمة أساسية. استدعاء دالة العودية من داخل النص الأساسي للدالة فقط كـ التي تقوم باستدعاء أي استدعاء دالة. يلي عودى تحسب دالة رقم Fibonacci th n. لقد تسلسل رقم Fibonacci المعروف منذ antiquity و هو تسلسل في أي رقم متتالي كل هو مجموع رقمين السابقة في التسلسل.

let rec fib n = if n < 2 then 1 else fib (n - 1) + fib (n - 2)

قد تجاوز سعة مكدس الذاكرة المؤقتة لبرنامج بعض دالات متداخلة أو تنفيذ inefficiently في حالة القيام بعدم الكتابة بحرص وإدراك من تقنيات خاص، مثل كـ استخدام accumulators و continuations.

قيم دالة

تعتبر القيم في F#, الجميع وظائف؛ في الواقع، تعرف كـ قيم دالة . نظراً لدالات قيم، يمكن استخدامها كوسيطات إلى وظائف غير ذلك أو في سياقات غير ذلك الموقع يتم استخدام قيم. التالي هو مثال عن دالة التي تأخذ القيمة دالة كـ وسيطة:

let apply1 (transform : int -> int ) y = transform y

تعيين نوع القيمة دالة بواسطة استخدام ->الرمز المميز. تشغيل الجانب الأيسر من الرمز المميز هذا هو نوع وسيطة، و تشغيل الجانب الأيسر هو الالقيمة التي يتم إرجاعها. في المثال السابق، apply1هو إحدى الدالات التي تأخذ دالة transformكوسيطة، الموقع transformهو إحدى الدالات التي تأخذ عددا صحيحاً وتقوم بإرجاع عدد صحيح آخر. يلي تعليمات برمجية يوضح كيفية استخدام apply1:

let increment x = x + 1

let result1 = apply1 increment 100

الالقيمة resultستكون 101 بعد السابق رمز التشغيل.

يتم فصل وسائط متعددة متتالية ->الرموز المميزة، كـ هو موضح في المثال التالي:

let apply2 ( f: int -> int -> int) x y = f x y

let mul x y = x * y

let result2 = apply2 mul 10 20

النتيجة هو 200.

تعبيرات لامدا

على تعبير lambda هو دالة غير مسمى. في الأمثلة السابقة، بدلاً من تعريف تسمية الدالات incrementو mul، يمكنك استخدام تعبيرات لامدا كـ التالي:

let result3 = apply1 (fun x -> x + 1) 100

let result4 = apply2 (fun x y -> x * y ) 10 20

تعريف تعبيرات لامدا باستخدام funكلمة أساسية. تعبير lambda لما بتعريف دالة، فيما عدا بدلاً من =الرمز المميز، ->الرمز المميز هو المستخدمة لفصل lهوt وسيطة في الدالة الأساسي. كما في تعريف دالة عادية ووسيطة يمكن الاستدلال أنواع أو تحديدها بوضوح نوع الإرجاع للتعبير لامدا هو الاستدلال من نوع التعبير الأخير في النص الأساسي. لمزيد من المعلومات، راجع التعبيرات لامدا: الترفيه كلمة أساسية (F#).

إنشاء دالة و Pipelining

دالات في ب # يمكن أن يتكون من الآخر دالات. التركيب من الثاني الدالات function1و function2هو دالة أخرى يمثل تطبيق function1متبوعاً بتطبيق function2:

let function1 x = x + 1
let function2 x = x * 2
let h = function1 >> function2
let result5 = h 100

النتيجة هو 202.

pipelining تمكين استدعاءات دوال إلى أن إلى gether متسلسلة متتالية العمليات. pipelining يعمل كما يلي:

let result = 100 |> function1 |> function2

النتيجة هو 202 مرة أخرى.

راجع أيضًا:

موارد أخرى

قيم (F#)

مرجع لغة ب #