سؤال

في "البرمجة F#" صادفت مطابقة نمط مثل هذا (لقد قمت بتبسيط قليلاً):

let rec len list = 
  match list with
  | [] -> 0
  | [_] -> 1
  | head :: tail -> 1 + len tail;;

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

هل كانت مفيدة؟

المحلول

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

let l = 1::2::[]                    // As an operator
match l with x::xs -> 1 | [] -> 0   // As a pattern

هذا يعني أنه بناء خاص بعض الشيء ، لأن المشغلين الآخرين (على سبيل المثال +) لا يمكن استخدامها كنماذج (لتحلل النتيجة مرة أخرى إلى وسيطات المشغل) - من الواضح ، ل +, ، هذا سيكون غامضا.

أيضا ، النمط [_] من المثير للاهتمام ، لأنه مثال على النمط المتداخل. يتألف:

  • _ - النمط التأكيد ، الذي يطابق أي قيمة ولا يربط أي رموز
  • [ <pattern> ] - نمط قائمة العناصر الفردية ، والذي يطابق قوائم بعناصر واحدة ويتطابق مع عنصر القائمة مع المتداخلة <pattern>.

يمكنك أيضا الكتابة match 1::[] with | [x] -> x والتي من شأنها أن تعيد قيمة العنصر الفردي (في هذه الحالة 1).

نصائح أخرى

إنه بناء جملة خاص للقوائم. يمكنك التفكير في list اكتب كاتحاد تمييز بالتالي:

type list<'T> =         // '
    | Nil
    | Cons of 'T * list<'T>

إلا أن هناك بناء جملة خاص يصنع Nil يكون [] و Cons(h,t) يكون h::t. ثم إنه مجرد نمط طبيعي مطابق لاتحاد تمييز. هل هذا يساعد؟

(ربما انظر أيضا إدخال المدونة هذا.)

يتم استخدامه كأنف أو رسمي pattern, ، "القائمة" مطابقة للأنماط الثلاثة:

] تعني القائمة فارغة

_] تعني أن القائمة لديها عنصر واحد ، لأنك لا تهتم بماهية العنصر ، لذلك ببساطة وضع _ هناك ، يمكنك أيضًا استخدام [A].

رأس :: الذيل يعني أن القائمة تحتوي على جزأين: رأس وذيل.

يمكنك عرض مطابقة F# Pattern كهيكل قوي إذا كان ذلك آخر.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top