عام (F#)

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

// Explicitly generic function.
let function-name<type-parameters> parameter-list =
   function-body

// Explicitly generic method.
[ static ] member object-identifer.method-name<type-parameters> parameter-list [ return-type ] =
   method-body

// Explicitly generic class, record, interface, structure,
// or discriminated union.
type type-name<type-parameters> type-definition

ملاحظات

إعلان الدالة العامة بشكل صريح أو نوع هو مثل دالة غير عام أو النوع، فيما عدا المواصفات (واستخدام) من نوع المعلمات، في زاوية أقواس بعد اسم الدالة أو نوعه.

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

في بناء الجملة السابق، type-parametersهي قائمة مفصولة بفواصل من المعلمات التي تمثل غير معروف أنواع، كل منها تبدأ بعلامة اقتباس مفردة، بشكل اختياري باستخدام جملة قيد التي أكثر من ذلك بتحديد ما هي أنواع تستخدم للذي اكتب معلمة. لبناء جملة قيد عبارات أنواعاً مختلفة ومعلومات غير ذلك حول القيود، راجع القيود (F#).

type-definitionفي بناء الجملة هو نفسه نوع تعريف لعام-غير نوع. تتضمن معلمات الدالة الإنشائية لنوع فئة، واختياري asجملة، والرمز متساوية، وحقول السجلات، inheritجملة، اختيارات توحيد discriminated، letو doروابط، ملفات تعريف عضو، و أي شيء آخر مسموح به في تعريف نوع غير عام.

عناصر بناء غير ذلك هي نفسها كتلك الوظائف غير عام و أنواع. ل مثال، object-identifierهو معرّف الذي يمثل الكائن الذي يحتوي على الصفحة نفسها.

خصائص أو حقولاً، و لا يمكن أن يكون المنشئات أكثر عمومية من نوع إرفاق. أيضا، لا يمكن أن قيم في وحدة نمطية عامة.

بنيات ضمنياً عام

عندما infers المحول البرمجي F# أنواع في تعليمات برمجية الخاصة بك، يعامل على تلقائياً أية وظيفة يمكن أن يكون العام كعام. إذا قمت بتحديد نوع بشكل واضح، مثل كـ نوع معلمة، فإنك تمنع تعميم تلقائي.

في المثال التالي تعليمات برمجية، makeListهو عام، على الرغم من ذلك ولا المعلمات الخاصة بها هي صراحة التصريح كـ عام.

let makeList a b =
    [a; b]

توقيع الرقمي للدالة هو الاستدلال أن 'a -> 'a -> 'a list. لاحظ أن aو bفي هذا المثال يتم الاستدلال للحصول على نفس نوع. Th هو هو لأنها كانت مضمنة في lهوt معا، ويجب أن تكون كافة العناصر من lهوt من نفس النوع.

يمكنك أيضا جعل دالة العام باستخدام بناء الجملة علامة اقتباس مفردة في تعليق توضيحي نوع للإشارة إلى أن نوع معلمة هو معلمة نوع عام. في التعليمة البرمجية التالية: function1هو العام لأنه يتم تعريف المعلمات الخاصة بها في ترتيب هو طريقة، كنوع المعلمات.

let function1 (x: 'a) (y: 'a) =
    printfn "%A, %A" x y

بوضوح بنيات العامة

يمكنك أيضا جعل دالة العام بوضوح التصريح المعلمات النوع الخاص به في أقواس معقوفة (<>). التعليمات البرمجية التالية توضح ذلك.

let function2<'T> x y =
    printfn "%A, %A" x y

استخدام عام بناء

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

يلي تعليمات برمجية يظهر استخدام الدوال التي تم تعريفها في الأقسام السابقة.

// In this case, the type argument is inferred to be int.
function1 10 20
// In this case, the type argument is float.
function1 10.0 20.0
// Type arguments can be specified, but should only be specified
// if the type parameters are declared explicitly. If specified,
// they have an effect on type inference, so in this example,
// a and b are inferred to have type int. 
let function3 a b =
    // The compiler reports a warning:
    function1<int> a b
    // No warning.
    function2<int> a b

ملاحظة

هناك طريقتان للإشارة إلى نوع عام بواسطة اسم. ل مثال، list<int>و int listبطريقتين للإشارة إلى نوع عام listيحتوي على وسيطة نوع مفرد int. النموذج الأخير هو conventionally يستخدم فقط مع المضمنة ب # أنواع مثل listو option. إذا كان هناك عدة نوع الوسائط، يمكنك عادة استخدام في بناء جملة Dictionary<int, string>ولكن يمكنك أيضا استخدام بناء الجملة (int, string) Dictionary.

أحرف البدل كـ نوع وسائط

إلى تحديد أنه وسيطة نوع يجب أن يكون الاستدلال بالمترجم، يمكنك استخدام تسطير أسفل السطر، أو الرمز حرف بدل (_)، بدلاً من وسيطة نوع مسمى. يظهر هذا في التعليمات البرمجية التالية.

let printSequence (sequence1: seq<_>) =
    Seq.iter (fun elem -> printf "%s " (elem.ToString())) sequence1

قيود في أنواع و وظائف عام

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

تم الحل معلمات نوع بشكل ثابت

هناك نوعان من معلمات نوع التي يمكن استخدامها في البرامج ب #. أول معلمات نوع عامة من نوع الموضحة في الأقسام السابقة. Th هو اﻷول نوع المعلمة نوع هو مساوية للنوع العام المعلمات المستخدمة في لغات مثل Vهوual أساسي و C#. نوع معلمة نوع آخر هو الخاصة ب # و هو يشار إليها على حل نوع معلمة بشكل ثابت . للحصول على المعلومات حول بنية هذه، راجع ثابت تم الحل نوع معلمات (F#).

أمثلة

// A generic function.
// In this example, the generic type parameter 'a makes function3 generic.
let function3 (x : 'a) (y : 'a) =
    printf "%A %A" x y

// A generic record, with the type parameter in angle brackets.
type GR<'a> = 
    {
        Field1: 'a;
        Field2: 'a;
    }


// A generic class.
type C<'a>(a : 'a, b : 'a) =
    let z = a
    let y = b
    member this.GenericMethod(x : 'a) =
        printfn "%A %A %A" x y z


// A generic discriminated union.
type U<'a> =
    | Choice1 of 'a
    | Choice2 of 'a * 'a

type Test() =
    // A generic member
    member this.Function1<'a>(x, y) =
        printfn "%A, %A" x, y

    // A generic abstract method.
    abstract abstractMethod<'a, 'b> : 'a * 'b -> unit
    override this.abstractMethod<'a, 'b>(x:'a, y:'b) =
         printfn "%A, %A" x y

راجع أيضًا:

المرجع

ثابت تم الحل نوع معلمات (F#)

القيود (F#)

موارد أخرى

مرجع لغة ب #

أنواع ب #

generics في .NET Framework

تعميم تلقائي (F#)