فئة النوع
في علوم الحاسوب ، تُعدّ فئة النوع بنيةً لنظام الأنواع تدعم تعدد الأشكال المخصص في لغة البرمجة . ويتحقق ذلك بإضافة قيود على متغيرات النوع في الأنواع متعددة الأشكال البارامترية . يتضمن هذا القيد عادةً فئة نوع Tومتغير نوعa ، ويعني أنه aلا يمكن إنشاء مثيل لهذا المتغير إلا من نوع تدعم أعضاؤه العمليات المُحمّلة المرتبطة به T.
تم تطبيق فئات الأنواع لأول مرة في لغة هاسكل بعد أن اقترحها فيليب وادلر وستيفن بلوت كامتداد للغة eqtypesStandard ML ، [ 1 ] [ 2 ] وقد صُممت في الأصل كوسيلة لتنفيذ عوامل الحساب والمساواة المُحمّلة بشكل زائد بطريقة منهجية. [ 3 ] [ 2 ] على عكس "أنواع المساواة" في Standard ML، فإن تحميل عامل المساواة بشكل زائد باستخدام فئات الأنواع في هاسكل لا يتطلب تعديلًا كبيرًا في واجهة المُصرّف أو نظام الأنواع الأساسي. [ 4 ]
ملخص
تُعرَّف فئات الأنواع بتحديد مجموعة من أسماء الدوال أو الثوابت، بالإضافة إلى أنواعها المقابلة، والتي يجب أن توجد لكل نوع ينتمي إلى الفئة. في لغة هاسكل، يمكن تحديد معاملات الأنواع؛ Eqوتُعرَّف فئة الأنواع التي تهدف إلى احتواء أنواع تقبل المساواة بالطريقة التالية:
class Eq a where ( == ) :: a -> a -> Bool ( /= ) :: a -> a -> Boolحيث aيمثل مثيل واحد من فئة النوع Eq، aويحدد توقيعات الدالة لدالتين (دالة المساواة ودالة عدم المساواة)، والتي تأخذ كل منها وسيطين من النوع aوتعيد قيمة منطقية.
نوع المتغير aهو نوع(يُعرف أيضًا باسم ( Typeفي أحدث إصدار من مُصرّف غلاسكو هاسكل (GHC))، [ 5 ]Eq مما يعني أن نوع
Eq :: Type -> Constraintيمكن قراءة هذا التصريح على أنه ينص على أن "النوع aينتمي إلى فئة النوع Eqإذا كانت هناك دوال باسم (==)و و (/=)من الأنواع المناسبة، مُعرَّفة عليه". ويمكن للمبرمج بعد ذلك تعريف دالة elem(تحدد ما إذا كان عنصر ما موجودًا في قائمة) بالطريقة التالية:
elem :: معادل a => a -> [ a ] -> Bool elem y [] = False elem y ( x : xs ) = ( x == y ) || العنصر y xsللدالة elemنوعٌ a -> [a] -> Boolضمن السياق Eq a، مما يقيد الأنواع التي aيمكن أن تتراوح إلى تلك aالتي تنتمي إلى Eqفئة النوع. ( =>يمكن تسمية هذا في لغة هاسكل بـ "قيد الفئة").
يمكن جعل أي نوع tعضوًا في فئة نوع معينة Cباستخدام تعريف مثيل يُحدد تطبيقات جميع Cتوابع الفئة للنوع المُعطى t. على سبيل المثال، إذا تم تعريف نوع بيانات جديد t، فيمكن جعل هذا النوع الجديد مثيلًا للفئة Eqبتوفير دالة مساواة على قيم النوع بأي طريقة مفيدة. بمجرد القيام بذلك، يمكن استخدام tالدالة على قوائم عناصر النوع .elem[t]t
تختلف فئات الأنواع عن الفئات في لغات البرمجة كائنية التوجه . تحديدًا، Eqليس نوعًا: لا يوجد شيء اسمه قيمة من النوع Eq.
ترتبط فئات الأنواع ارتباطًا وثيقًا بتعدد الأشكال البارامتريelem . على سبيل المثال، سيكون النوع المحدد أعلاه نوعًا متعدد الأشكال بارامتريًا لولا قيد فئة النوع " ".a -> [a] -> BoolEq a =>
تعدد الأشكال من الدرجة الأعلى
لا يشترط أن تأخذ فئة النوع متغير نوع من النوع المحددType ، بل يمكنها أن تأخذ متغيرًا من أي نوع. تُسمى فئات الأنواع هذه، التي تحتوي على أنواع أعلى، أحيانًا بفئات البناء (المُنشئات المشار إليها هي مُنشئات النوع مثل `type` Maybe، وليست مُنشئات البيانات مثل `data` Just). مثال على ذلك Monadالفئة `type`:
صنف Monad m حيث يُرجع :: a -> m a ( >>= ) :: m a -> ( a -> m b ) -> m bيشير تطبيق ذلك mعلى متغير نوع إلى أن له نوعاً Type -> Type، أي أنه يأخذ نوعاً ويعيد نوعاً، ويكون نوع هذا المتغير Monadكالتالي:
Monad :: ( النوع -> النوع ) -> القيدفئات أنواع متعددة المعلمات
تسمح فئات الأنواع بمعاملات أنواع متعددة ، ولذا يمكن اعتبار فئات الأنواع علاقات بين الأنواع. [ 6 ] على سبيل المثال، في مكتبة GHC القياسية ، تُعبّر الفئة عن واجهة مصفوفة عامة غير قابلة للتغيير. في هذه الفئة، يعني IArrayقيد فئة النوع أن هو نوع مصفوفة يحتوي على عناصر من النوع . (يُستخدم هذا القيد على تعدد الأشكال لتنفيذ أنواع المصفوفات غير المُغلّفة ، على سبيل المثال).IArray a eae
على غرار الدوال المتعددة ، تدعم فئات الأنواع متعددة المعاملات استدعاء تطبيقات مختلفة للدالة بناءً على أنواع الوسائط المتعددة، وكذلك أنواع القيم المُعادة. لا تتطلب فئات الأنواع متعددة المعاملات البحث عن الدالة المراد استدعاؤها في كل استدعاء أثناء وقت التشغيل؛ [ 7 ] : الدقيقة 25:12، بل يتم أولاً تجميع الدالة المراد استدعاؤها وتخزينها في قاموس مثيل فئة النوع، تمامًا كما هو الحال مع فئات الأنواع أحادية المعامل.
لا يُعدّ كود Haskell الذي يستخدم فئات أنواع متعددة المعاملات قابلاً للنقل وفقًا لمعيار Haskell 98، وهو ليس أحدث معيار. تدعم تطبيقات Haskell الشائعة، مثل GHC و Hugs ، فئات الأنواع متعددة المعاملات.
التبعيات الوظيفية
في لغة هاسكل، تم تحسين فئات الأنواع لتمكين المبرمج من تحديد التبعيات الوظيفية بين معلمات الأنواع ، وهو مفهوم مستوحى من نظرية قواعد البيانات العلائقية . [ 8 ] [ 9 ] أي أن المبرمج يستطيع التأكيد على أن تعيينًا معينًا لمجموعة فرعية من معلمات الأنواع يحدد بشكل فريد معلمات الأنواع المتبقية. على سبيل المثال، المونادm العام الذي يحمل معلمة حالة من النوع sيحقق قيد فئة النوع Monad.State s m. في هذا القيد، توجد تبعية وظيفية m -> s. هذا يعني أنه بالنسبة لموناد معين mمن فئة النوع Monad.State، يتم تحديد نوع الحالة الذي يمكن الوصول إليه من mبشكل فريد. يساعد هذا المترجم في استنتاج الأنواع ، كما يساعد المبرمج في البرمجة الموجهة بالأنواع .
اعترض سيمون بيتون جونز على إدخال التبعيات الوظيفية في لغة هاسكل على أساس التعقيد. [ 10 ]
فئات الأنواع والمعلمات الضمنية
تتشابه فئات الأنواع والمعاملات الضمنية في طبيعتها، وإن لم تكن متطابقة تمامًا. مثال على دالة متعددة الأشكال ذات قيد فئة نوع:
sum :: Num a => [ a ] -> aيمكن التعامل معها بشكل بديهي كدالة تقبل ضمنيًا مثالًا من Num:
sum_ :: Num_ a -> [ a ] -> aإن المثال Num_ aهو في الأساس سجل يحتوي على تعريف المثال لـ Num a. (هذه في الواقع هي الطريقة التي يتم بها تنفيذ فئات الأنواع داخليًا بواسطة مترجم غلاسكو هاسكل.)
مع ذلك، ثمة فرق جوهري: المعاملات الضمنية أكثر مرونة ؛ إذ يمكن تمرير نسخ مختلفة منها Num Int. في المقابل، تفرض فئات الأنواع ما يُسمى بخاصية التماسك ، التي تشترط وجود نسخة واحدة فريدة فقط لأي نوع مُعطى. تجعل خاصية التماسك فئات الأنواع مُضادة للنمطية إلى حد ما، ولهذا السبب يُنصح بشدة بتجنب النسخ اليتيمة (النسخ المُعرّفة في وحدة لا تحتوي على الفئة أو النوع المطلوب). مع ذلك، يُضيف التماسك مستوى آخر من الأمان للغة، إذ يضمن أن جزأين منفصلين من نفس الكود سيشتركان في نفس النسخة. [ 11 ]
على سبيل المثال، تتطلب المجموعة المرتبة (من النوع ) ترتيبًا كليًا لعناصرها (من النوع ) لكي تعمل. ويمكن إثبات ذلك من خلال قيد ، الذي يُعرّف عامل مقارنة على العناصر. ومع ذلك، توجد طرق عديدة لفرض ترتيب كلي. ولأن خوارزميات المجموعات لا تتسامح عمومًا مع تغييرات الترتيب بعد إنشاء المجموعة، فإن تمرير نسخة غير متوافقة من إلى الدوال التي تعمل على المجموعة قد يؤدي إلى نتائج غير صحيحة (أو أعطال). لذا، يُعدّ ضمان اتساق في هذا السيناريو تحديدًا أمرًا بالغ الأهمية.Set aaOrd aOrd aOrd a
تُعدّ النسخ (أو "القواميس") في فئات أنواع Scala مجرد قيم عادية في اللغة، وليست كيانًا منفصلاً تمامًا. [ 12 ] [ 13 ] وبينما يتم توفير هذه النسخ افتراضيًا من خلال إيجاد نسخ مناسبة ضمن النطاق لاستخدامها كمعاملات ضمنية للمعاملات الرسمية الضمنية المُعلنة صراحةً، فإن كونها قيمًا عادية يعني إمكانية توفيرها صراحةً لحلّ أي لبس. ونتيجةً لذلك، لا تُحقق فئات أنواع Scala خاصية التماسك، وتُعتبر في الواقع اختصارًا نحويًا للمعاملات الضمنية.
هذا مثال مأخوذ من وثائق Cats: [ 14 ]
// فئة نوع لتوفير سمة تمثيل نصي Show [ A ] { def show ( f : A ): String }// دالة متعددة الأشكال تعمل فقط عند وجود نسخة ضمنية من Show[A] متاحة. def log [ A ] ( a : A )( implicit s : Show [ A ]) = println ( s.show ( a ) )// مثال لـ String implicit val stringShow = new Show [ String ] { def show ( s : String ) = s }// تم إدراج المعامل stringShow بواسطة المُصرّف. scala > log ( "a string" ) a stringيدعم برنامج Rocq (المعروف سابقًا باسم Coq )، بدءًا من الإصدار 8.2، فئات الأنواع عن طريق استنتاج الحالات المناسبة. [ 15 ] كما توفر الإصدارات الحديثة من Agda 2 ميزة مماثلة تُسمى "وسائط الحالة". [ 16 ]
أساليب أخرى للتعامل مع إرهاق المشغل
في لغة Standard ML ، تتوافق آلية "أنواع المساواة" تقريبًا مع فئة الأنواع المدمجة في لغة Haskell Eq، ولكن جميع عوامل المساواة تُشتق تلقائيًا بواسطة المُصرّف. ويقتصر تحكم المبرمج في هذه العملية على تحديد مكونات النوع في بنية ما التي تُمثل أنواع مساواة، ومتغيرات النوع في نطاق الأنواع متعددة الأشكال التي تُمثل أنواع مساواة.
يمكن أن تؤدي وحدات ودوال SML و OCaml دورًا مشابهًا لدور فئات الأنواع في Haskell، ويكمن الاختلاف الرئيسي في دور استنتاج النوع، مما يجعل فئات الأنواع مناسبة للتعدد الشكلي المخصص . [ 17 ] وتُعد المجموعة الفرعية الموجهة للكائنات في OCaml نهجًا آخر يُقارن إلى حد ما بنهج فئات الأنواع.
مفاهيم ذات صلة
يُعد مفهوم عائلة الأنواع مفهومًا مشابهًا للبيانات المحملة بشكل زائد (المطبقة في GHC ) . [ 18 ]
في لغة C++ ، وخاصةً C++20 ، يوجد دعم لفئات الأنواع باستخدام " المفاهيمEq ". على سبيل المثال، سيتم تنفيذ مثال Haskell المذكور أعلاه لفئة النوع على النحو التالي:
باستخدام std :: convertible_to ;// مكافئ لـ std::equality_comparable template < typename T > concept EqualityComparable = requires ( T a , T b ) { { a == b } -> convertible_to < bool > ; { a != b } -> convertible_to < bool > ; };// باستخدام مفهوم EqualityComparable: template < EqualityComparable T > [[ nodiscard ]] constexpr bool isEqual ( const T & x , const T & y ) noexcept { return x == y ; }في لغة Go ، يمكن اعتبار الواجهة بمثابة فئة نوع، وهي تعادل تقريبًا مفهومًا في لغة C++. [ 19 ]
في لغتي Java و C# ، تشبه الواجهات فئات الأنواع، حيث تحدد "واجهة" من الطرق المراد تنفيذها (انظر واجهات Java ).
في لغة Clean ، تكون فئات الأنواع مشابهة للغة Haskell، ولكن لها صيغة مختلفة قليلاً .
يدعم Rust السمات ، وهي شكل محدود من فئات الأنواع ذات التماسك، ويمكن اعتبارها أيضًا مشابهة للواجهات . [ 20 ]
يحتوي Mercury على فئات أنواع، على الرغم من أنها ليست مطابقة تمامًا لتلك الموجودة في Haskell.
في لغة سكالا ، تُعدّ فئات الأنواع أسلوبًا برمجيًا يُمكن تطبيقه باستخدام ميزات اللغة الموجودة، مثل المعاملات الضمنية، وليست ميزة لغوية مستقلة بحد ذاتها. وبفضل طريقة تطبيقها في سكالا، يُمكن تحديد فئة النوع التي سيتم استخدامها لنوع معين في موضع محدد من الكود، في حال وجود غموض. مع ذلك، لا يُعدّ هذا بالضرورة ميزة، إذ قد تكون فئات الأنواع الغامضة عرضةً للأخطاء.
يدعم برنامج Rocq المساعد للإثبات أيضًا فئات الأنواع في الإصدارات الحديثة. على عكس لغات البرمجة العادية، في Rocq، يجب إثبات أي قوانين لفئة نوع (مثل قوانين الموناد) المذكورة ضمن تعريف فئة النوع رياضيًا لكل حالة من حالات فئة النوع قبل استخدامها.
مراجع
- ↑ موريس، جون ج. (2013). فئات الأنواع وسلاسل الحالات: منهج علائقي (ملف PDF) (أطروحة دكتوراه). قسم علوم الحاسوب، جامعة ولاية بورتلاند. doi : 10.15760/etd.1010 .
- 1 2 وادلر، ب .؛ بلوت، س. (1989). "كيفية جعل تعدد الأشكال المخصص أقل تخصيصًا" . وقائع الندوة السادسة عشرة لجمعية آلات الحوسبة SIGPLAN-SIGACT حول مبادئ لغات البرمجة (POPL '89) . جمعية آلات الحوسبة. ص 60-76 . doi : 10.1145/75277.75283 . ISBN 0897912942. S2CID 15327197 .
- ↑ كايس، ستيفان (مارس 1988). "التحميل الزائد للمعاملات في لغات البرمجة متعددة الأشكال". وقائع الندوة الأوروبية الثانية حول لغات البرمجة . doi : 10.1007/3-540-19027-9_9 .
- ↑ أبيل، أ. و.؛ ماكوين، د. ب. (1991). "Standard ML of New Jersey". في: مالوزينسكي، ج.؛ ويرسينغ، م. (محرران). تنفيذ لغات البرمجة والبرمجة المنطقية. PLILP 1991. سلسلة محاضرات في علوم الحاسوب. المجلد 528. سبرينغر. الصفحات 1-13 . CiteSeerX 10.1.1.55.9444 . doi : 10.1007/3-540-54444-5_83 . ISBN 3-540-54444-5.
- ↑ " ظهرت في الإصدار 8 من مترجم Glasgow Haskell" .
TypeData.Kind - ↑ صفحة هاسكل MultiParamTypeClasses .
- ↑ في GHC، يستخدم لبّ لغة C توقيعات نوع System F لجيرارد ورينولدز لتحديد حالة مُنمّطة للمعالجة في مراحل التحسين. – سيمون بيتون جونز، " في قلب اللغة - ضغط هاسكل في تسعة مُنشئات"، مؤتمر مستخدمي إرلانج، 14 سبتمبر 2016
- ↑ جونز، مارك ب. (2000). "فئات الأنواع ذات التبعيات الوظيفية" . في سمولكا، ج. (محرر). لغات البرمجة والأنظمة. ESOP 2000. سلسلة محاضرات في علوم الحاسوب. المجلد 1782. سبرينغر. الصفحات 230-244 . CiteSeerX 10.1.1.26.7153 . doi : 10.1007/3-540-46425-5_15 . ISBN 3-540-46425-5.
- ↑ صفحة Haskell' FunctionalDependencies .
- ↑ بيتون جونز، سيمون (2006). "MPTCs والتبعيات الوظيفية" . قائمة بريد Haskell-prime .
- ↑ كيميت، إدوارد (21 يناير 2015). فئات الأنواع مقابل العالم (فيديو). لقاء بوسطن هاسكل. مؤرشف من الأصل في 21 ديسمبر 2021.
- ↑ أوليفيرا، برونو سي دي إس؛ مورز، أدريان؛ أوديرسكي، مارتن (2010). "فئات الأنواع ككائنات وضمنية" (ملف PDF) . وقائع المؤتمر الدولي لجمعية آلات الحوسبة حول أنظمة ولغات وتطبيقات البرمجة كائنية التوجه (OOPSLA '10) . جمعية آلات الحوسبة. الصفحات 341-360 . CiteSeerX 10.1.1.205.2737 . doi : 10.1145/1869459.1869489 . ISBN 9781450302036. S2CID 207183083 .
- ↑ "دليل المبتدئين إلى سكالا الجزء 12: فئات الأنواع - دانيال ويستهايد" .
- ↑ typelevel.org، قطط سكالا
- ↑ كاستيران، ب.؛ سوزو، م. (2014). "مقدمة مبسطة لأنواع الفئات والعلاقات في Coq" (ملف PDF) . CiteSeerX 10.1.1.422.8091 .
- ↑ " نمذجة فئات الأنواع باستخدام وسائط المثيل ".
- ↑ دراير، ديريك؛ هاربر، روبرت؛ تشاكرافارتي، مانويل إم تي (2007). "فئات الأنواع المعيارية". وقائع الندوة السنوية الرابعة والثلاثين لجمعية ACM SIGPLAN-SIGACT حول مبادئ لغات البرمجة (POPL '07) . الصفحات 63-70. انظر الصفحة 63. doi : 10.1145/1190216.1190229 . ISBN 978-1595935755. S2CID 1828213 . TR-2006-03.
- ↑ "عائلات GHC/Type - HaskellWiki" .
- ↑ مؤلفو لغة Go. "جولة في واجهات Go" . go.dev . مؤلفو لغة Go . تم الاطلاع عليه بتاريخ 5 مايو 2026 .
- ↑ تورون، آرون (2017). التخصص والتماسك وتطور واجهة برمجة التطبيقات (تقرير).
- بيتون جونز، سيمون ؛ جونز، مارك؛ ماير، إريك (مايو 1997). "فئات الأنواع: استكشاف فضاء التصميم" . وقائع ورشة عمل ACM SIGPLAN Haskell . CiteSeerX 10.1.1.1085.8703 .
روابط خارجية
- "5. فئات الأنواع والتحميل الزائد" . مقدمة مبسطة إلى لغة هاسكل . يونيو 2000. الإصدار 98.
- دورة البرمجة الوظيفية المتقدمة في جامعة أوتريخت، 74 شريحة محاضرة حول فئات الأنواع المتقدمة . 2005-06-07.
- تطبيق وفهم فئات الأنواع . 2014-11-13.
- البرمجة الوظيفية
- نظرية الأنواع
- أنواع البيانات
- مقارنات لغات البرمجة
