فهم مطابقة النمط مع مشغل السلبيات
-
27-09-2019 - |
سؤال
في "البرمجة 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 كهيكل قوي إذا كان ذلك آخر.