الأنماط (F#)

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

ملاحظات

الأنماط المستخدمة في العديد من بنيات لغة، مثل كـ matchالتعبير. يتم استخدامها عند الذي يتم معالجة الوسيطات لدالة في letروابط، لامدا تعبير s، ومعالجات الاستثناءات المقترنة try...withتعبير. لمزيد من المعلومات، راجع تطابق التعبيرات (F#), ترك للربط (F#), التعبيرات لامدا: الترفيه كلمة أساسية (F#) و الاستثناءات: حاول... مع تعبير (F#).

على سبيل المثال، في matchالتعبير، patternهو فيما يلي الرمز توجيه الإخراج.

مطابقة expression

| pattern when condition] ->result-expression

...

يعمل كل نقش كـ قاعدة لتحويل إدخال في بعض الطرق. في matchالتعبير، كل نقش هو اختبار لمعرفة ما إذا كان بدورها بيانات إدخال هو متوافقة مع نمط. في حالة تطابق هو العثور على التعبير نتيجة هو تنفيذها. في حالة تطابق هو غير موجود، قاعدة النمط التالي هو اختبار. عند اختياري conditionجزء هو الموضح في تطابق التعبيرات (F#).

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

الاسم

الوصف

المثال

ثابت نقش

أي numeric, حرف, أو سلسلة قيمة حرفية, an قائمة تعداد ثابت, أو a defined قيمة حرفية معرّف

1.0, "test", 30, Color.Red

معرّف نقش

A حالة القيمة of a discriminated توحيد, an ‏‏ استثناء التسمية, أو an نشط نقش حالة

Some(x)

Failure(msg)

متغير نقش

identifier

a

as نقش

نقش كـ معرّف

(a, b) as tuple1

أو نقش

pattern1 | pattern2

([h] | [h; _])

و نقش

pattern1 & pattern2

(a, b) & (_, "test")

Cons نقش

identifier :: list-identifier

h :: t

قائمة نقش

[ pattern_1; ... ; pattern_n

[ a; b; c ]

صفيفة نقش

[| pattern_1; ..; pattern_n

[| a; b; c |]

Parenthesized نقش

( pattern )

( a )

Tuple نقش

( pattern_1, ... , pattern_n )

( a, b )

سجل نقش

{ identifier1 = pattern_1; ... ; identifier_n = pattern_n }

{ Name = name; }

حرف بدل نقش

_

_

نقش مع نوع التعليق التوضيحي

pattern : type

a : int

نوع نقش الاختبار

:? type كـidentifier]

:? System.DateTime as dt

خالي نقش

ملغى

null

ثابت أنماط

أنماط ثابتة ثابتان الرقمية وحرف أو سلسلة حرفية، التعداد (مع التعداد اسم النوع مضمنة)، وقيم التي يتم وضع علامة Literalالسمة. matchيمكن مقارنتها تعبير يحتوي على أنماط ثابتة فقط لبيان حالة في غير ذلك اللغات. الإدخال هو بالمقارنة مع قيمة الحرفية والنمط تطابقات إذا تساوي قيم. النوع قيمة حرفية يجب أن يتوافق مع نوع إدخال.

يوضح المثال التالي استخدم أنماط الحرفية، وأيضا استخدم s نمط متغير و أو النقش.

[<Literal>]
let Three = 3

let filter123 x =
    match x with
    // The following line contains literal patterns combined with an OR pattern.
    | 1 | 2 | Three -> printfn "Found 1, 2, or 3!"
    // The following line contains a variable pattern.
    | var1 -> printfn "%d" var1

for x in 1..10 do filter123 x

ومن الأمثلة الأخرى لنمط قيمة حرفية هو نمط استناداً إلى ثوابت التعداد. يجب تحديد نوع التعداد تسمية متى قمت استخدم ثوابت التعداد.

type Color =
    | Red = 0
    | Green = 1
    | Blue = 2

let printColorName (color:Color) =
    match color with
    | Color.Red -> printfn "Red"
    | Color.Green -> printfn "Green"
    | Color.Blue -> printfn "Blue"
    | _ -> ()

printColorName Color.Red
printColorName Color.Green
printColorName Color.Blue

أنماط معرّف

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

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

optionهو نوع توحيد discriminated له الثاني الحالات، Someو None. حالة واحدة ( Some) له القيمة، ولكن الآخر ( None) هو تماما عن مسمى الحالة. لذلك، Someيحتاج إلى لديك متغير القيمة المقترنة Someحالة، ولكن Noneيجب أن يظهر بنفسه. في التعليمة البرمجية التالية: متغير var1هو إعطاء القيمة هو الحصول عليها بواسطة مطابقة Someالحالة.

let printOption (data : int option) =
    match data with
    | Some var1  -> printfn "%d" var1
    | None -> ()

في المثال التالي، PersonNamediscriminated التوحيد يحتوي على خليط من سلاسل والأحرف التي تمثل النماذج الممكنة من أسماء. تكون حالات توحيد discriminated FirstOnly، LastOnly، و FirstLast.

type PersonName =
    | FirstOnly of string
    | LastOnly of string
    | FirstLast of string * string

let constructQuery personName = 
    match personName with
    | FirstOnly(firstName) -> printf "May I call you %s?" firstName
    | LastOnly(lastName) -> printf "Are you Mr. or Ms. %s?" lastName
    | FirstLast(firstName, lastName) -> printf "Are you %s %s?" firstName lastName

تمكنك الأنماط النشطة إلى تعريف مطابقة النقش cusإلىm أكثر تعقيداً. لمزيد من المعلومات حول نشاط أنماط، راجع أنماط النشطة (F#).

الحالة التي المعرف هو استثناء هو المستخدمة في نمط المطابقة في سياق معالجات ‏‏ استثناء. لمعلومات حول نقش مطابقة في معالجة ‏‏ استثناء، راجع الاستثناءات: حاول... مع تعبير (F#).

أنماط متغير

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

يلي مثال يوضح نمط متغير ضمن نمط المجموعة.

let function1 x =
    match x with
    | (var1, var2) when var1 > var2 -> printfn "%d is greater than %d" var1 var2 
    | (var1, var2) when var1 < var2 -> printfn "%d is less than %d" var1 var2
    | (var1, var2) -> printfn "%d equals %d" var1 var2

function1 (1,2)
function1 (2, 1)
function1 (0, 0)

كـ النقش

asهو نمط نقش الذي يحتوي asجملة إلحاق إلى it. asجملة بربط القيمة تطابق باسم التي يمكن استخدامها في تعبير التنفيذ من matchالتعبير، أو في الحالة الموقع th هو نقش هو المستخدمة في letربط الاسم هو تمت الإضافة كرابط إلى نطاق المحلي.

يلي مثال يستخدم على asنقش.

let (var1, var2) as tuple1 = (1, 2)
printfn "%d %d %A" var1 var2 tuple1

أو نقش

نقش أو هو يستخدم عندما يمكن لبيانات إدخال مطابقة نماذج متعددة وتريد ينفذ نفس تعليمات برمجية ونتيجة لذلك. أنواع من وجهي أو نموذج يجب أن يتوافق.

يلي مثال يوضح نقش أو.

let detectZeroOR point =
    match point with
    | (0, 0) | (0, _) | (_, 0) -> printfn "Zero found."
    | _ -> printfn "Both nonzero."
detectZeroOR (0, 0)
detectZeroOR (1, 0)
detectZeroOR (0, 10)
detectZeroOR (10, 15)

و نقش

و نقش يتطلب أن يطابق إدخال محاذيين. الأنواع كلاهما جوانب نقش يجب أن تكون متوافقة.

المثال التالي هو مثل detectZeroTupleالمعروضة في قسم نمط المجموعة لاحقاً في ترتيب هو الموضوع، ولكن هنا كلا var1و var2يتم الحصول على القيم باستخدام نمط AND.

let detectZeroAND point =
    match point with
    | (0, 0) -> printfn "Both values zero."
    | (var1, var2) & (0, _) -> printfn "First value is 0 in (%d, %d)" var1 var2
    | (var1, var2)  & (_, 0) -> printfn "Second value is 0 in (%d, %d)" var1 var2
    | _ -> printfn "Both nonzero."
detectZeroAND (0, 0)
detectZeroAND (1, 0)
detectZeroAND (0, 10)
detectZeroAND (10, 15)

نقش اتصالات

يستخدم نقش اتصالات في تحلل قائمة في في العنصر أول و رأس قائمة تحتوي على العناصر المتبقية، ذيل .

let list1 = [ 1; 2; 3; 4 ]

// This example uses a cons pattern and a list pattern.
let rec printList l =
    match l with
    | head :: tail -> printf "%d " head; printList tail
    | [] -> printfn ""

printList list1

قائمة نقش

تمكين نمط قائمة من قوائم في يمكن decomposed في في عددا من العناصر. قائمة يمكن مطابقة نقش نفسه فقط قائمة s لعدد معين من العناصر.

// This example uses a list pattern.
let listLength list =
    match list with
    | [] -> 0
    | [ _ ] -> 1
    | [ _; _ ] -> 2
    | [ _; _; _ ] -> 3
    | _ -> List.length list

printfn "%d" (listLength [ 1 ])
printfn "%d" (listLength [ 1; 1 ])
printfn "%d" (listLength [ 1; 1; 1; ])
printfn "%d" (listLength [ ] )

صفيفة النقش

تشابه نمط القائمة نقش الصفيف ويمكن استخدامه لتحلل صفائف فترة محددة.

// This example uses array patterns.
let vectorLength vec =
    match vec with
    | [| var1 |] -> var1
    | [| var1; var2 |] -> sqrt (var1*var1 + var2*var2)
    | [| var1; var2; var3 |] -> sqrt (var1*var1 + var2*var2 + var3*var3)
    | _ -> failwith "vectorLength called with an unsupported array size of %d." (vec.Length)

printfn "%f" (vectorLength [| 1. |])
printfn "%f" (vectorLength [| 1.; 1. |])
printfn "%f" (vectorLength [| 1.; 1.; 1.; |])
printfn "%f" (vectorLength [| |] )

نقش Parenthesized

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

let countValues list value =
    let rec checkList list acc =
       match list with
       | (elem1 & head) :: tail when elem1 = value -> checkList tail (acc + 1)
       | head :: tail -> checkList tail acc
       | [] -> acc
    checkList list 0

let result = countValues [ for x in -10..10 -> x*x - 4 ] 0
printfn "%d" result

المجموعة نقش

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

يوضح المثال التالي نمط المجموعة و أيضا باستخدام الأنماط قيمة حرفية، الأنماط المتغيرة، و نمط أحرف البدل.

let detectZeroTuple point =
    match point with
    | (0, 0) -> printfn "Both values zero."
    | (0, var2) -> printfn "First value is 0 in (0, %d)" var2
    | (var1, 0) -> printfn "Second value is 0 in (%d, 0)" var1
    | _ -> printfn "Both nonzero."
detectZeroTuple (0, 0)
detectZeroTuple (1, 0)
detectZeroTuple (0, 10)
detectZeroTuple (10, 15)
let detectZeroTuple point =
    match point with
    | (0, 0) -> printfn "Both values zero."
    | (0, var2) -> printfn "First value is 0 in (0, %d)" var2
    | (var1, 0) -> printfn "Second value is 0 in (%d, 0)" var1
    | _ -> printfn "Both nonzero."
detectZeroTuple (0, 0)
detectZeroTuple (1, 0)
detectZeroTuple (0, 10)
detectZeroTuple (10, 15)

سجل النقش

نقش سجل هو المستخدمة لتحلل السجلات لاستخراج قيم حقول. لا يحتوي نقش إلى تشير إلى الجميع الحقول في السجل؛ أي حقول مهملة غير المشاركة في مطابقة فقط ويتم استخراج.

// This example uses a record pattern.

type MyRecord = { Name: string; ID: int }

let IsMatchByName record1 (name: string) =
    match record1 with
    | { MyRecord.Name = nameFound; MyRecord.ID = _; } when nameFound = name -> true
    | _ -> false

let recordX = { Name = "Parker"; ID = 10 }
let isMatched1 = IsMatchByName recordX "Parker"
let isMatched2 = IsMatchByName recordX "Hartono"

حرف بدل نقش

التلائمات النقش بدل أي إدخال، مثل المتغير النقش، فيما عدا الذي الإدخال هو dهوcarded بدلاً من تعيينها إلى متغير. النقش بدل هو غالباً في الأنماط الأخرى كحرف نائب للقيم غير مطلوبة في التعبير إلى يمين ->الرمز. نقش بدل هو أيضا استخداماً في إنهاء lهوt نقوش بحيث تتطابق مع أي إدخال غير متطابقة. يتم هو موضح نقش حرف بدل في العديد من أمثلة تعليمات برمجية في هذا الموضوع. راجع تعليمات برمجية السابق لإحدى مثال.

النقوش التي نوع تعليقات توضيحية

أنماط يمكن أن يكون نوع التعليقات التوضيحية. هذه تسلك البعض نوع التعليقات التوضيحية ودليل الاستخراج مثل البعض نوع التعليقات التوضيحية. تكون الأقواس ضرورية حول نوع التعليقات التوضيحية في النقوش. يلي تعليمات برمجية يظهر نقش الذي يحتوي على تعليق توضيحي نوع.

let detect1 x =
    match x with
    | 1 -> printfn "Found a 1!"
    | (var1 : int) -> printfn "%d" var1

نقش اختبار نوع

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

يلي مثال يوضح نقش اختبار نوع.

open System.Windows.Forms

let RegisterControl(control:Control) =
    match control with
    | :? Button as button -> button.Text <- "Registered."
    | :? CheckBox as checkbox -> checkbox.Text <- "Registered."
    | _ -> ()

null نقش

null التلائمات نقش null الالقيمة التي يمكن أن تظهر عند العمل مع الأنواع التي تسمح null القيمة. خالي أنماط تستخدم بشكل متكرر عند interoperating مع .NET Frameworkتعليمات برمجية. على سبيل المثال، القيمة الإرجاع ل API.NET قد يكون إدخال إلى matchتعبير. يمكنك التحكم في تدفق البرنامج استناداً إلى ما إذا كان سيتم إرجاع الالقيمة هو فارغة، وأيضا تشغيل characterهوtics غير ذلك للالقيمة التي تم إرجاعها. يمكنك استخدم نقش فارغة لمنع قيم الفارغة من الانتشار إلى باقي البرنامج الخاص بك.

يستخدم المثال التالي نموذج فارغ و نمط متغير.

let ReadFromFile (reader : System.IO.StreamReader) =
    match reader.ReadLine() with
    | null -> printfn "\n"; false
    | line -> printfn "%s" line; true

let fs = System.IO.File.Open("..\..\Program.fs", System.IO.FileMode.Open)
let sr = new System.IO.StreamReader(fs)
while ReadFromFile(sr) = true do ()

راجع أيضًا:

المرجع

تطابق التعبيرات (F#)

أنماط النشطة (F#)

موارد أخرى

مرجع لغة ب #