تعدد الأشكال الصفية

في نظرية أنواع لغات البرمجة ، يعد تعدد الأشكال الصفية نوعًا من تعدد الأشكال يسمح بكتابة برامج متعددة الأشكال هيكليًا [ 1 ] (بدلاً من اسميًا) على أنواع السجلات و/أو المتغيرات . [ 2 ]

التاريخ والنظرية

تم تقديم نظام أنواع متعدد الأشكال للصفوف وإثبات استنتاج النوع للسجلات بواسطة ميتشل واند . [ 3 ] [ 4 ]

إنّ المعالجة النظرية لتعدد أشكال الصفوف معقدة نوعًا ما بسبب الحاجة إلى وجود تسميات مميزة في السجل. أحد المناهج التي اتبعها ريمي وزملاؤه (والموجودة ضمنيًا في العرض التقديمي أدناه، والمستوحى بشكل كبير من منهج واند)، هو النظر في أنواع مختلفة من الصفوف، اعتمادًا على تسمياتها. [ 2 ]

قام جاستر وجونز بتوسيع هذا النهج ليشمل المتغيرات أيضًا، وذلك بجعل كل من مُنشئ نوع السجل ومنشئ نوع المتغير يربط بين أنواع الصفوف والأنواع. [ 5 ]

اقترح بلوم وآخرون تطوير هذا النهج خطوةً أخرى نحو مجال الامتدادات القابلة للتركيب، وذلك بإضافة "حالات من الدرجة الأولى" تُعالج بواسطة LetCCبنية لتركيب الاستمراريات في كود مطابقة الحالات. [ 6 ] بعد ذلك، استخدم مشروعان (لينكس ، كوكا) تعدد الأشكال الصفية كأساس نوعي لنظام التأثيرات الجبرية ، بهدف "التركيب الحر" للتأثيرات المُعرَّفة من قِبل المستخدم. [ 7 ] [ 8 ]

يتمثل أحد الأساليب الأخرى لمعالجة مسألة التصنيفات الفريدة في توسيع النظام F باستخدام عامل "دمج متماسك"، مما ينتج عنه حسابات ذات أنواع تقاطع منفصلة . [ 9 ]

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

تعريف نوع السجل متعدد الأشكال للصفوف

يُعرّف نوع السجل متعدد الأشكال للصفوف قائمةً بالحقول وأنواعها المقابلة، وقائمةً بالحقول المفقودة، ومتغيرًا يُشير إلى وجود أو عدم وجود حقول إضافية. كلا القائمتين اختياريتان، ويمكن تقييد المتغير. تحديدًا، قد يكون المتغير "فارغًا"، مما يُشير إلى عدم إمكانية وجود حقول إضافية في السجل.

يمكن كتابتها على النحو التالي:{1:تي1،...،ن:تين،غائب(و1)،...،غائب(وم)،ρ}{\displaystyle \{\ell _{1}:T_{1},\dots ,\ell _{n}:T_{n},{\text{absent}}(f_{1}),\dots ,{\text{absent}}(f_{m}),\rho \}}يشير هذا إلى نوع سجل يحتوي على حقولأنا{\displaystyle \ell _{i}}مع الأنواع ذات الصلة منتيأنا{\displaystyle T_{i}}أنا=1...ن{\displaystyle i=1\dots n})، ولا يحتوي على أي من الحقولوج{\displaystyle f_{j}}ج=1...م{\displaystyle j=1\dots m})، بينماρ{\displaystyle \rho }يعبّر عن حقيقة أن السجل قد يحتوي على حقول أخرى غيرأنا{\displaystyle \ell _{i}}.

تتيح لنا أنواع السجلات متعددة الأشكال كتابة برامج تعمل فقط على جزء من سجل. على سبيل المثال، يمكن تعريف دالة تُجري تحويلاً ثنائي الأبعاد، تقبل سجلاً يحتوي على إحداثيين أو أكثر، وتُرجع نوعًا مطابقًا.

تحويل ثنائي الأبعاد:{x:رقم،y:رقم،ρ}{x:رقم،y:رقم،ρ}{\displaystyle {\text{transform2d}}:\{x:{\text{Number}},y:{\text{Number}},\rho \}\to \{x:{\text{Number}},y:{\text{Number}},\rho \}}

بفضل تعدد أشكال الصفوف، يمكن للدالة إجراء تحويل ثنائي الأبعاد على نقطة ثلاثية الأبعاد (في الواقع، ذات n بُعد)، مع الحفاظ على الإحداثي z (أو أي إحداثيات أخرى) كما هو. وبشكل أعم، يمكن للدالة العمل على أي سجل يحتوي على الحقلين x و y من النوعرقم{\displaystyle {\text{الرقم}}}لا يوجد فقدان للمعلومات: يضمن النوع أن جميع الحقول التي يمثلها المتغيرρ{\displaystyle \rho }موجودة في نوع الإرجاع. في المقابل، تعريف النوع{x:رقم،y:رقم،هـمصتy}{\displaystyle \{x:{\text{عدد}},y:{\text{عدد}},\mathbf {فارغ} \}}يُعبّر هذا عن حقيقة أن سجلًا من هذا النوع يحتوي على الحقلين x و y فقط ، ولا يحتوي على أي شيء آخر. في هذه الحالة، نحصل على نوع سجل كلاسيكي.

عمليات الكتابة على السجلات

عمليات تسجيل تحديد حقلر.{\displaystyle r.\ell }إضافة حقلر[:=هـ]{\displaystyle r[\ell :=e]} ، وإزالة حقلر{\displaystyle r\backslash \ell }يمكن إعطاؤها أنواعًا متعددة الأشكال للصفوف.

sهـلهـجت=λر.(ر.):{:تي،ρ}تي{\displaystyle \mathrm {select_{\ell }} =\lambda r.(r.\ell )\;:\;\{\ell :T,\rho \}\rightarrow T}

أدد=λر.λهـ.ر[:=هـ]:{أبsهـنت()،ρ}تي{:تي،ρ}{\displaystyle \mathrm {add_{\ell }} =\lambda r.\lambda er[\ell :=e]\;:\;\{\mathrm {absent} (\ell ),\rho \}\rightarrow T\rightarrow \{\ell :T,\rho \}}

رهـمovهـ=λر.ر:{:تي،ρ}{أبsهـنت()،ρ}{\displaystyle \mathrm {remove_{\ell }} =\lambda rr\backslash \ell \;:\;\{\ell :T,\rho \}\rightarrow \{\mathrm {absent} (\ell ),\rho \}}

التطبيقات

لا يتم دعم تعدد الأشكال الصفية في Standard ML ، ولكن يتم دعمه في بعض الامتدادات أو المشتقات مثل SML# [ 11 ] و Ocaml .

كان الدافع وراء وجود الإصدار الأول من SML# [ 12 ] هو إضافة تعدد الأشكال الصفية، استنادًا إلى ورقة بحثية نُشرت في مؤتمر SIGMOD '89 من قِبل أوهوري وآخرون [ 13 ] ، والتي قدمت امتداد "ميكافيلي" إلى SML، على الرغم من تغيير اسمها لاحقًا إلى "SML# of Kansai"، قبل الاستقرار على الاسم المختصر. لا ترتبط علامة "#" في الاسم بلغة F# ، وإنما تعود إلى #المعامل المستخدم لتعريف أنواع تعدد الأشكال الصفية ضمنيًا عند الوصول إلى الحقول.

في لغة OCaml، يُستخدم تعدد الأشكال الصفّي في objectأنواع OCaml وفي متغيراتها متعددة الأشكال. أما أنواع السجلات العادية فلا تدعم تعدد الأشكال الصفّي في OCaml. [ 14 ] وقد انتقد كاستاغنا وآخرون لغة OCaml لافتقارها إلى تحديد الأنواع الحساسة للتدفق ، وهو ما يظهر جليًا في استنتاج الأنواع للمتغيرات متعددة الأشكال. كما لاحظوا أنه نظرًا لافتقار OCaml إلى أنواع الاتحاد الحقيقية غير الموسومة ، فإن بعض الأنواع المستنتجة للمتغيرات متعددة الأشكال تكون مقيدة للغاية، لا سيما عند استخدام أنواع المنتجات مع المتغيرات متعددة الأشكال. [ 15 ]

يمكن للغة F# محاكاة تعدد الأشكال الصفية باستخدام آلية "معاملات النوع المُحَلَّلة ثابتًا" (SRTP)، [ 16 ] والتي تُعرف أيضًا بشكل غير رسمي باسم " الكتابة الديناميكية الثابتة ". [ 17 ] ومع ذلك، يقتصر هذا على دوال F# المضمنة، بحيث لا يتم تصديرها إلى نظام أنواع .NET ، الذي لا يدعم هذه الميزة.

يدعم PureScript أيضًا تعدد الأشكال الصفية . [ 18 ]

ملحوظات

  1. https://www.cs.cmu.edu/~aldrich/courses/819/slides/rows.pdf ، ص 12
  2. 1 2 فرانسوا بوتييه وديدييه ريمي، "جوهر استنتاج أنواع ML"، الفصل 10 في كتاب "مواضيع متقدمة في الأنواع ولغات البرمجة"، تحرير بنجامين سي. بيرس، مطبعة معهد ماساتشوستس للتكنولوجيا، 2005، الصفحات 389-489. انظر على وجه الخصوص الصفحة 466 حيث تتم مناقشة أنواع السجلات والصفحة 483 حيث تتم مناقشة المتغيرات متعددة الأشكال.
  3. واند، ميتشل (يونيو 1989). "استدلال النوع لتسلسل السجلات والوراثة المتعددة". وقائع الندوة السنوية الرابعة حول المنطق في علوم الحاسوب . الصفحات 92-97 . doi : 10.1109/LICS.1989.39162 . 
  4. واند، ميتشل (1991). "استدلال النوع لدمج السجلات والوراثة المتعددة". المعلومات والحوسبة . 93 (مختارات من ندوة IEEE لعام 1989 حول المنطق في علوم الحاسوب): 1-15 . doi : 10.1016/0890-5401(91)90050-C . ISSN 0890-5401 . 
  5. بينيديكت ر. جاستر ومارك ب. جونز، نظام أنواع متعدد الأشكال للسجلات والمتغيرات القابلة للتوسيع، تقرير فني NOTTCS-TR-96-3، نوفمبر 1996
  6. ماتياس بلوم، أوموت أ. أكار، وونسوك تشاي، البرمجة القابلة للتوسيع مع حالات من الدرجة الأولى، المؤتمر الدولي للبرمجة الاحترافية 2006
  7. د. ليجن. كوكا: البرمجة باستخدام أنواع التأثير متعددة الأشكال للصفوف. في: ب. ليفي ون. كريشناسوامي (محرران)، وقائع ورشة العمل الخامسة حول البرمجة الوظيفية المهيكلة رياضياً، MSFP، غرونوبل، فرنسا، أبريل 2014، المجلد 153 من EPTCS، الصفحات 100-126، 2014
  8. دانيال هيلرستروم، وسام ليندلي. "تأثيرات التحرير مع الصفوف والمُعالجين". TyDe 2016. نارا، اليابان. 2016. doi:10.1145/2976022.2976033.
  9. نينغنينغ شي، برونو سي. دي. إس. أوليفيرا، شوان بي، توم شريفرز، تعدد الأشكال الصفية والمحدودة عبر تعدد الأشكال المنفصلة، ​​ECOOP 2020
  10. ج. غاريت موريس، جيمس ماكينا، "تجريد أنواع البيانات القابلة للتوسيع: أو، الصفوف بأي اسم آخر"، POPL 2019
  11. "8 ميزة SML#: تعدد أشكال السجلات‣ الجزء الثاني: الدروس التعليمية ‣ إصدار مستند SML# 4.0.0 - مشروع SML#" .
  12. "نبذة تاريخية عن مشروع SML#" .
  13. أوهوري، أتسوكي؛ بونيمان، بيتر؛ بريازو-تانين، فال (1989). "برمجة قواعد البيانات في لغة مكيافيلي - لغة متعددة الأشكال مع استنتاج نوع ثابت" . وقائع مؤتمر ACM SIGMOD الدولي لإدارة البيانات لعام 1989 - SIGMOD '89 . الصفحات 46-57 . doi : 10.1145/67544.66931 . ISBN  0-89791-317-5.
  14. https://www.cl.cam.ac.uk/teaching/1415/L28/rows.pdf ، صفحة 8
  15. جوزيبي كاستاغنا، توماسو بيتروتشياني، كيم نغوين، "أنواع نظرية المجموعات للمتغيرات متعددة الأشكال"، المؤتمر الدولي لنظرية المجموعات 2016
  16. "بوليمورف ماذا؟" . 8 ديسمبر 2017.
  17. "الكتابة الثابتة في F# | تكنولوجيا المعلومات التركيبية" .
  18. "مطابقة الأنماط - PureScript من خلال الأمثلة" .