تعدد الأشكال البارامتري
في لغات البرمجة ونظرية الأنواع ، يسمح تعدد الأشكال البارامتري بإعطاء جزء واحد من التعليمات البرمجية نوعًا "عامًا"، باستخدام متغيرات بدلًا من الأنواع الفعلية، ثم إنشاء مثيلات بأنواع محددة حسب الحاجة. [ 1 ] : 340 تُسمى الدوال وأنواع البيانات متعددة الأشكال البارامترية أحيانًا بالدوال العامة وأنواع البيانات العامة ، على التوالي، وهي تُشكل أساس البرمجة العامة .
يمكن التمييز بين التعدد الشكلي البارامتري والتعدد الشكلي المخصص . تتسم التعريفات متعددة الأشكال البارامترية بالتجانس ، إذ تتصرف بشكل متطابق بغض النظر عن نوع الكائن الذي تُنشأ منه. [ 1 ] : 340 [ 2 ] : 37 في المقابل، تُعطى التعريفات متعددة الأشكال المخصصة تعريفًا مميزًا لكل نوع. وبالتالي، لا يدعم التعدد الشكلي المخصص عمومًا إلا عددًا محدودًا من هذه الأنواع المتميزة، نظرًا لضرورة توفير تطبيق منفصل لكل نوع.
إن الأداة النظرية المعتادة لدراسة تعدد الأشكال البارامتري هي النظام F ، الذي يوسع حساب لامدا المكتوب ببساطة مع التحديد الكمي على الأنواع.
التعريف الأساسي
من الممكن كتابة دوال لا تعتمد على أنواع وسائطها. على سبيل المثال، دالة التطابق.ببساطة، تُعيد الدالة وسيطها دون تعديل. وهذا يُؤدي بطبيعة الحال إلى ظهور مجموعة من الأنواع المحتملة، مثل:،،وهكذا. يسمح تعدد الأشكال البارامتريأن يتم إعطاؤه نوعًا واحدًا وأكثر عمومية من خلال إدخال متغير نوع كمي عالمي :
يمكن بعد ذلك إنشاء تعريف متعدد الأشكال عن طريق استبدال أي نوع ملموس بـمما ينتج عنه المجموعة الكاملة من الأنواع المحتملة. [ 3 ]
تُعد دالة التطابق مثالًا متطرفًا بشكل خاص، ولكن العديد من الدوال الأخرى تستفيد أيضًا من تعدد الأشكال البارامتري. على سبيل المثال،الدالة التي تدمج قائمتين لا تفحص عناصر القائمة، بل تفحص بنية القائمة نفسها فقط. لذلك ،يمكن تصنيفها ضمن عائلة مماثلة من الأنواع، مثل،وهكذا دواليك، حيثيشير إلى قائمة من العناصر من النوعوبالتالي فإن النوع الأكثر عمومية هو
والتي يمكن تطبيقها على أي نوع في العائلة.
الدوال متعددة الأشكال البارامترية مثلويقال إنها مُعَلمة على نوع عشوائي[ 4 ] كلاهماوتُحدد المعاملات بناءً على نوع واحد، بينما يمكن تحديد معاملات الدوال بناءً على عدد غير محدود من الأنواع. على سبيل المثال،ويمكن إعطاء الدوال التي تُرجع العنصرين الأول والثاني من الزوج ، على التوالي، الأنواع التالية:
في التعبير،يتم إنشاء مثيل لـويتم إنشاء مثيل لـفي الدعوة إلىإذن، نوع التعبير العام هو.
تختلف الصيغة المستخدمة لإدخال تعدد الأشكال البارامتري اختلافًا كبيرًا بين لغات البرمجة. على سبيل المثال، في بعض لغات البرمجة، مثل هاسكل ، فإنالمُكمِّم ضمني ويمكن حذفه. [ 5 ] تتطلب لغات أخرى تحديد الأنواع بشكل صريح في مواقع استدعاء الدالة متعددة الأشكال ذات المعاملات ، إما في جميع المواقع أو على الأقل بما يكفي للسماح باستنتاج النوع لتحديد الباقي.
تاريخ
تم تقديم التعدد الشكلي البارامتري لأول مرة إلى لغات البرمجة في لغة ML عام 1975. [ 6 ] وهو موجود اليوم في لغات Standard ML و OCaml و F# و Ada و Haskell و Mercury و Visual Prolog و Scala و Julia و Python و TypeScript و C++ وغيرها. وقد قدمت لغات Java و C# و Visual Basic .NET و Delphi كل منها "الأنواع العامة" للتعدد الشكلي البارامتري. بعض تطبيقات تعدد الأشكال النوعي تشبه ظاهريًا التعدد الشكلي البارامتري، مع إدخال جوانب مخصصة. ومن الأمثلة على ذلك تخصيص القوالب في لغة C++ .
في ثمانينيات القرن العشرين، قدّم ليفانت نسخةً مُصنَّفة (أي تنبؤية) من نظام جيرارد ورينولدز F. يعتمد منهج ليفانت على مفهوم رتبة المُكمِّمات، الذي يقيس عمق تداخلها داخل مُنشئات الدوال . [ 7 ] يقتصر منهج ML من هذا المنظور على تعدد الأشكال من الرتبة 1. تبنّت لغة هاسكل تعدد الأشكال البارامتري من رتبة أعلى في تسعينيات القرن العشرين. على سبيل المثال، يُستخدم تعدد الأشكال البارامتري من الرتبة 2 في هاسكل لتعريف الموناد runST، الذي يُحاكي فعليًا نظام النوع والتأثير ، [ 8 ] مع "مناطق معزولة من البرمجة الإجرائية". على مستوى النوع، ينبع عزل الحالة أساسًا من التكميم الأعمق من الرتبة 2 على الحالة في runST. (هذا لا يكفي لوصف دلالات وقت التشغيل رسميًا runST. لهذا الأخير، يحتاج المرء إلى بعض العناصر الإضافية مثل منطق الفصل . [ 9 ] )
التنبؤية، وعدم التنبؤية، وتعدد الأشكال من الرتبة العليا
يُقال إن نوعًا ما من الرتبة k (لعدد صحيح ثابت k ) إذا لم يكن هناك مسار من جذره إلىيمر المُكمِّم إلى يسار k سهم أو أكثر، عند تمثيل النوع كشجرة. [ 1 ] : 359 يُقال إن نظام النوع يدعم تعدد الأشكال من الرتبة k إذا كان يسمح بأنواع ذات رتبة أقل من أو تساوي k . على سبيل المثال، يسمح نظام النوع الذي يدعم تعدد الأشكال من الرتبة 2 بما يلي:لكن ليسيُقال عن نظام النوع الذي يقبل أنواعًا ذات رتبة عشوائية أنه "متعدد الأشكال من الرتبة n ".
(يختلف مفهوم الرتبة هذا عن كيفية تعريف رتبة الكميات في المنطق الكلاسيكي لأنه هنا يقيس عمق التداخل بالنسبة إلى رابط غير كمي ، بينما في المنطق الكلاسيكي لا تزيد الروابط غير الكمية من رتبة الكميات المتداخلة تحتها، ولكن الكميات الأخرى تفعل ذلك.)
تعدد الأشكال من الرتبة 1 (التنبؤي)
في نظام الأنواع التنبؤي (المعروف أيضًا بنظام تعدد الأشكال المسبق )، لا يجوز إنشاء متغيرات الأنواع باستخدام أنواع متعددة الأشكال. [ 1 ] : 359-360. تشمل نظريات الأنواع التنبؤية نظرية مارتن-لوف ونظرية Nuprl . وهذا مشابه جدًا لما يُسمى "نمط ML" أو "تعدد أشكال Let" (تقنيًا، يخضع تعدد أشكال Let في ML لبعض القيود النحوية الأخرى). هذا القيد يجعل التمييز بين الأنواع متعددة الأشكال وغير متعددة الأشكال بالغ الأهمية؛ لذا، في الأنظمة التنبؤية، يُشار أحيانًا إلى الأنواع متعددة الأشكال باسم مخططات الأنواع لتمييزها عن الأنواع العادية (أحادية الشكل)، والتي تُسمى أحيانًا بالأنواع الأحادية .
من نتائج خاصية التنبؤ أنه يمكن كتابة جميع الأنواع بصيغة تضع جميع المحددات الكمية في الموضع الخارجي (prenex). على سبيل المثال، انظر إلىالدالة الموضحة أعلاه، والتي لها النوع التالي:
من أجل تطبيق هذه الوظيفة على زوج من القوائم، نوع محدديجب استبدال المتغيربحيث يكون نوع الدالة الناتجة متسقًا مع أنواع الوسائط. في نظام غير تنبؤي ،قد يكون أي نوع على الإطلاق، بما في ذلك النوع متعدد الأشكال نفسه؛ وبالتالييمكن تطبيقها على أزواج من القوائم التي تحتوي على عناصر من أي نوع - حتى على قوائم الدوال متعددة الأشكال مثلفي حد ذاتها. تعددية الأشكال في لغة ML تنبؤية. [ 10 ] وذلك لأن التنبؤية، إلى جانب قيود أخرى، تجعل نظام الأنواع بسيطًا بما يكفي بحيث يكون استنتاج النوع الكامل ممكنًا دائمًا.
كمثال عملي، يقوم OCaml (وهو أحد أحفاد أو لهجات ML ) باستنتاج النوع ويدعم تعدد الأشكال غير التنبؤي، ولكن في بعض الحالات عند استخدام تعدد الأشكال غير التنبؤي، يكون استنتاج نوع النظام غير مكتمل ما لم يقدم المبرمج بعض التعليقات التوضيحية الصريحة للنوع.
تعدد الأشكال ذو الرتبة الأعلى
تدعم بعض أنظمة الأنواع مُنشئ نوع دالة غير تنبؤية، على الرغم من أن مُنشئات الأنواع الأخرى تظل تنبؤية. على سبيل المثال، النوعيُسمح بذلك في نظام يدعم تعدد الأشكال من الرتبة الأعلى، على الرغم منقد لا يكون كذلك. [ 11 ]
يُمكن تحديد نوع التعدد الشكلي من الرتبة الثانية، ولكن ليس من الرتبة الثالثة فما فوق. [ 12 ] [ 1 ] : 359
تعدد الأشكال التنبؤي
يُعدّ التعدد الشكلي غير التنبؤي (ويُسمى أيضًا التعدد الشكلي من الدرجة الأولى ) أقوى أشكال التعدد الشكلي البارامتري. [ 1 ] : 340 في المنطق الصوري ، يُقال إن التعريف غير تنبؤي إذا كان مرجعيًا ذاتيًا؛ وفي نظرية الأنواع، يشير إلى قدرة النوع على أن يكون ضمن نطاق المُكمِّم الذي يحتويه. وهذا يسمح بتجسيد أي متغير نوع بأي نوع، بما في ذلك الأنواع متعددة الأشكال. ومن الأمثلة على الأنظمة التي تدعم عدم التنبؤ الكامل النظام F ، الذي يسمح بتجسيدمن أي نوع، بما في ذلك نفسه.
في نظرية الأنواع ، تستند حسابات λ-الأنواع غير التنبؤية الأكثر دراسة إلى تلك الخاصة بمكعب لامدا ، وخاصة النظام F.
تعميمات لمفهوم الرتبة
يمكن تعميم مفهوم ليفانت للرتبة ليشمل رموزًا أخرى غير المُكمِّمات باستخدام استبدال بسيط ومناسب. على سبيل المثال، يمكن تطبيقه على أنواع التقاطع (المنشئة) . مع ذلك، قد تختلف خصائص التسلسل الهرمي للأنواع القائم على الرتبة. فعلى سبيل المثال، يظل استنتاج النوع للنظام F ذي الرتبة 3 وما فوق غير قابل للتقرير (كما هو موضح أعلاه)، بينما يكون استنتاج النوع لأنواع التقاطع قابلاً للتقرير لجميع الرتب المحدودة. [ 13 ]
تعدد الأشكال البارامتري المحدود
في عام 1985، أدرك لوكا كارديلي وبيتر ويغنر مزايا السماح بتقييد معلمات النوع. [ 14 ] تتطلب العديد من العمليات معرفةً بأنواع البيانات، ولكنها يمكن أن تعمل بشكل معياري. على سبيل المثال، للتحقق مما إذا كان عنصر ما مُدرجًا في قائمة، نحتاج إلى مقارنة العناصر للتأكد من تساويها. في لغة Standard ML ، تُقيّد معلمات النوع من الشكل ''a' بحيث تكون عملية المساواة متاحة، وبالتالي سيكون للدالة النوع ''a × ''a list → bool، ولا يمكن أن يكون ''a' إلا نوعًا مُعرّفًا للمساواة. في لغة Haskell ، يتم تحقيق التقييد من خلال اشتراط انتماء الأنواع إلى فئة نوع ؛ وبالتالي فإن الدالة نفسها لها النوعفي لغة هاسكل. في معظم لغات البرمجة الموجهة للكائنات التي تدعم تعدد الأشكال البارامتري، يمكن تقييد المعلمات لتكون أنواعًا فرعية من نوع معين (انظر المقالات تعدد الأشكال من النوع الفرعي والبرمجة العامة ).
انظر أيضاً
ملحوظات
- 1 2 3 4 5 6 بنجامين سي. بيرس (2002). أنواع ولغات البرمجة . مطبعة معهد ماساتشوستس للتكنولوجيا. ISBN 978-0-262-16209-8.
- ↑ ستراشي، كريستوفر (1967)، المفاهيم الأساسية في لغات البرمجة (ملاحظات المحاضرات)، كوبنهاغن: المدرسة الصيفية الدولية في برمجة الحاسوبأُعيد نشره في: ستراشي، كريستوفر (1 أبريل 2000). "المفاهيم الأساسية في لغات البرمجة" . الحوسبة الرمزية والحسابية من الرتبة العليا . 13 (1): 11-49 . doi : 10.1023/A:1010000313106 . ISSN 1573-0557 . S2CID 14124601 .
- ↑ يورجي، برنت. "المزيد من تعدد الأشكال وفئات الأنواع" . www.seas.upenn.edu . تم الاطلاع عليه في 1 أكتوبر 2022 .
- ↑ وو، براندون. "تعدد الأشكال البارامتري - مساعدة SML" . smlhelp.github.io . مؤرشف من الأصل في 1 أكتوبر 2022. تم الاسترجاع في 1 أكتوبر 2022 .
- ↑ " تقرير لغة هاسكل 2010، القسم 4.1.2: بناء جملة الأنواع" . www.haskell.org . تم الاطلاع عليه في 1 أكتوبر 2022.
باستثناء واحد (وهو متغير النوع المميز في تعريف الفئة (القسم 4.3.1))، يُفترض أن جميع متغيرات النوع في تعبير نوع هاسكل مُكمّمة عالميًا؛ ولا يوجد بناء جملة صريح للتكميم العالمي.
- ↑ ميلنر، ر. ، موريس، ل.، نيوي، م. "منطق للدوال القابلة للحساب ذات الأنواع الانعكاسية والمتعددة الأشكال"، وقائع مؤتمر إثبات وتحسين البرامج ، أرك-إي-سينان (1975)
- ↑ د. ليفانت، استنتاج النوع متعدد الأشكال، في: سجل المؤتمر السنوي العاشر لندوة ACM حول مبادئ لغات البرمجة، 1983، ص 88-98.
- ↑ إي. موجي وعمرو صبري. 2001. التغليف الأحادي للتأثيرات: منهج منقح (نسخة موسعة). مجلة البرمجة الوظيفية 11، 6 (نوفمبر 2001)، 591-627
- ↑ أمين تيماني، ليو ستيفانيسكو، مورتن كروغ-جيسبرسن، لارس بيركيدال، "علاقة منطقية للتغليف الأحادي للحالة: إثبات التكافؤات السياقية في وجود runST"، POPL 2018
- ↑ ميتشل، جيه سي؛ هاربر، آر. (13 يناير 1988). "جوهر لغة ML" . وقائع الندوة الخامسة عشرة لجمعية ACM SIGPLAN-SIGACT حول مبادئ لغات البرمجة - POPL '88 . نيويورك، نيويورك، الولايات المتحدة الأمريكية: جمعية آلات الحوسبة. الصفحات 28-46 . doi : 10.1145/73560.73563 . ISBN 978-0-89791-252-5.
- ↑ كوانغ يول سيو. "مدونة كوانغ هاسكل - تعدد الأشكال ذو الرتبة الأعلى" . kseo.github.io . تم الاطلاع عليه بتاريخ 30 سبتمبر 2022 .
- ↑ كفوري، أ. ج.؛ ويلز، ج. ب. (1 يناير 1999). "استدلال النوع الرئيسي والقابل للتقرير لأنواع التقاطع ذات الرتبة المحدودة". وقائع الندوة السادسة والعشرين لجمعية آلات الحوسبة SIGPLAN-SIGACT حول مبادئ لغات البرمجة . جمعية آلات الحوسبة. ص 161-174 . doi : 10.1145/292540.292556 . ISBN 1581130953. S2CID 14183560 .
- ↑ كفوري، أ. ج.؛ ويلز، ج. ب. (يناير 2004). "استدلال المبدأ والنوع لأنواع التقاطع باستخدام متغيرات التوسع". علوم الحاسوب النظرية : 1-70 .
- ↑ كارديلي وويجنر 1985 .
مراجع
- هيندلي، ج. روجر (1969)، "مخطط النوع الرئيسي للكائن في المنطق التوافقي"، معاملات الجمعية الرياضية الأمريكية ، 146 : 29-60 ، doi : 10.2307/1995158 ، JSTOR 1995158 ، MR 0253905 .
- جيرار، جان إيف (1971). "Une Extension de l'Interpretation de Gödel à l'Analyse، وهو تطبيق على l'Éliminating des Coupures dans l'Analyse et la Théorie des Types". وقائع ندوة المنطق الاسكندنافية الثانية . دراسات في المنطق وأسس الرياضيات (باللغة الفرنسية). المجلد. 63. أمستردام. الصفحات من 63 إلى 92. دوى : 10.1016/S0049-237X(08)70843-7 . رقم ISBN 9780720422597.
- جيرارد ، جان إيف (1972)، التفسير الوظيفي والقضاء على انقباضات الحساب الأعلى (رسالة دكتوراه) (بالفرنسية)، جامعة باريس 7.
- رينولدز ، جون سي. (1974)، “نحو نظرية بنية النوع” ، Colloque Sur la Programmation ، ملاحظات محاضرة في علوم الكمبيوتر ، 19 ، باريس: 408-425 ، دوى : 10.1007 / 3-540-06859-7_148 ، ISBN 978-3-540-06859-4
{{citation}}: CS1 maint: work parameter with ISBN ( link ) . - ميلنر، روبن (1978). "نظرية تعدد الأشكال في البرمجة" (ملف PDF) . مجلة علوم الحاسوب والنظم . 17 (3): 348-375 . doi : 10.1016/0022-0000(78)90014-4 . S2CID 388583 .
- كارديلي، لوكا ؛ ويغنر، بيتر (ديسمبر 1985). "حول فهم الأنواع، وتجريد البيانات، وتعدد الأشكال" (ملف PDF) . مجلة ACM Computing Surveys . 17 (4): 471-523 . CiteSeerX 10.1.1.117.695 . doi : 10.1145/6041.6042 . ISSN 0360-0300 . S2CID 2921816 .
- بيرس، بنجامين سي. (2002). أنواع لغات البرمجة . مطبعة معهد ماساتشوستس للتكنولوجيا. ISBN 978-0-262-16209-8.
- البرمجة العامة
- تعدد الأشكال (علوم الحاسوب)
- نظرية الأنواع
