سؤال

لقد كنت أحاول أن أشرح الفرق بين التبديل البيانات و مطابقة نمط(F#) إلى اثنين من الناس ولكن لم أكن قادرة على تفسير ذلك جيدا..أكثر من مرة أنها مجرد إلقاء نظرة على لي ويقول: "لماذا لا يمكنك فقط استخدام إذا..ثم..آخر".

كيف ستشرح لهم ؟

تحرير!شكرا للجميع على إجابات كبيرة, أنا حقا أتمنى أن مارك متعددة الإجابات الصحيحة.

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

المحلول

بعد أن سابقا كان واحدا من هؤلاء "الناس" أنا لا أعرف أن هناك طريقة مقتضبة أن نلخص لماذا نمط مطابقة مثل هذا لذيذ الخير.إنه التجريبية.

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

حاولت أن نلخص جانب واحد من جوانب لماذا نمط مطابقة مفيد في الثاني من مسافة قصيرة جزئين سلسلة بلوق في اللغة API التصميم ؛ تحقق من الجزء الأول و الجزء الثاني.

نصائح أخرى

وأنماط تعطيك لغة صغيرة لوصف هيكل القيم التي تريد مطابقتها. هيكل يمكن أن تكون عميقة بشكل تعسفي ويمكنك ربط المتغيرات إلى أجزاء من قيمة منظم.

وهذا يسمح لك لكتابة أشياء بإيجاز للغاية. يمكنك توضيح ذلك بمثال صغير، مثل وظيفة مشتقة لنوع بسيط من التعبيرات الرياضية:

type expr =
    | Int of int
    | Var of string
    | Add of expr * expr
    | Mul of expr * expr;;

let rec d(f, x) =
    match f with
    | Var y when x=y -> Int 1
    | Int _ | Var _ -> Int 0
    | Add(f, g) -> Add(d(f, x), d(g, x))
    | Mul(f, g) -> Add(Mul(f, d(g, x)), Mul(g, d(f, x)));;

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

مقتطفات من هذا بلوق المادة:

مطابقة نمط لديها العديد من المزايا أكثر من التبديل البيانات و طريقة الإرسال:

  • نمط المباريات يمكن أن تعمل على رجات ، يطفو, سلاسل أنواع أخرى مثل فضلا عن الكائنات.
  • نمط المباريات يمكن أن تعمل على عدة قيم مختلفة في وقت واحد:موازية مطابقة النقش.طريقة إرسال التبديل تقتصر على واحد القيمة مثلا ، "هذا".
  • أنماط يمكن أن تكون متداخلة ، مما يسمح إرسال فوق الأشجار التعسفي عمق.طريقة الإرسال والتبديل محدودة إلى غير متداخلة القضية.
  • أو أنماط تسمح subpatterns أن يكون المشتركة.طريقة إرسال يسمح فقط تقاسم عندما طرق من الفئات التي يحدث حصة قاعدة فئة.وإلا يجب عليك يدويا عامل من القواسم المشتركة في وظيفة منفصلة (يعطيها اسم) ثم يدويا إدراج المكالمات من جميع الأماكن المناسبة الخاصة بك لا لزوم لها وظيفة.
  • مطابقة نمط يوفر التكرار التحقق من الذي يمسك الأخطاء.
  • متداخلة أو متوازية نمط المباريات هي الأمثل بالنسبة لك من قبل F# مترجم.OO ما يعادلها يجب أن تكون مكتوبة باليد باستمرار reoptimized باليد أثناء التنمية باهظة مملة خطأ عرضة لذلك إنتاج-جودة OO رمز يميل إلى تكون بطيئة جدا في المقارنة.
  • نشط أنماط تسمح لك لحقن مخصص إرسال دلالات.

من على قمة رأسي:

  1. المترجم يمكن أن أقول إذا لم تكن تغطي كل الاحتمالات في المباريات
  2. يمكنك استخدام المباراة مهمة
  3. إذا كان لديك التمييز الاتحاد, كل مباراة يمكن أن يختلف نوع '

والتبديل هو العجلات الأمامية اثنين.

ونمط مطابقة هي السيارة بأكملها.

والتيوبل يكون "،" والمتغيرات ديك وسائط المنشئ .. هذه هي الصانعين، لأنها تخلق الأشياء.

وأنماط هي تالفة، ومزق بينهما.

وانهم مفاهيم مزدوجة.

لوضع هذا بقوة أكبر: فكرة وجود الصفوف (tuple) أو البديل لا يمكن وصفها بمجرد المنشئ لها: مطلوب المدمر أو القيمة التي قمت بها لا طائل منه. ومن هذه الأوصاف المزدوجة التي تحدد قيمة.

وعموما نحن نفكر في المنشئات مثل البيانات، و destructors كما التحكم في التدفق. تالفة متفاوتة هي فروع بديلة (واحد من كثير)، تالفة الصفوف (tuple) هي المواضيع موازية (كل من كثير).

والتوازي هو واضح في عمليات مثل

(f * g) . (h * k) = (f . h * g . k) 

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

وإذا نظرنا إلى هذه الطريقة، التعابير هي الطرق لتكوين الصفوف والمتغيرات لجعل هياكل البيانات المعقدة (اعتقد من AST).

ومباريات نمط هي الطرق لتكوين تالفة (مرة أخرى، التفكير في AST).

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

  • شاملة (أي حالات غاب)
  • غير زائدة (أي الحالات التي لا يمكن أبدا أن ضرب لأنهم استبق قبل قضية سابقة)
  • الصوت (أي الأنماط التي هي مستحيلة بالنظر إلى نوع البيانات في السؤال)

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

إذا، شيء آخر (أو التبديل) التصريحات حول اختيار طرق مختلفة لمعالجة قيمة (المدخلات) اعتمادا على خصائص من القيمة في متناول اليد.

ونمط مطابقة حوالي تحديد كيفية معالجة قيمة نظرا ل<م> هيكل ، (لاحظ أيضا أن واحد نمط حالة تطابق معنى).

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

وPS: هل يمكن أن نعرف في مباراة نمط و "أنماط" إذا بين آخر من استخدام المخصصة في الرياضيات.

و"إذا كان x ديه خاصية A ثم ض آخر ذ" (إذا-آخر)

و"بعض المصطلح في p1..pn حيث .... هو التحلل رئيس من العاشر .." ((حالة واحدة) مباراة نمط)

وربما يمكنك رسم قياسا مع سلاسل والتعابير العادية؟ يمكنك أن تصف <م> ما كنت تبحث عنه، والسماح للشخصية المترجم من كيف لنفسها. يجعل التعليمات البرمجية أسهل بكثير وأكثر وضوحا.

وبوصفها جانبا: أجد أن أنفع شيء حول مطابقة النقش هو أنه يشجع على عادات جيدة. أنا أتعامل مع الحالات الزاوية <م> أولا ، وأنه من السهل للتأكد من أن كنت قد غطت كل حالة.

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