نوع الوحدة
في مجال المنطق الرياضي وعلوم الحاسوب المعروف بنظرية الأنواع ، يُعرف النوع الأحادي بأنه نوع يسمح بقيمة واحدة فقط (وبالتالي لا يمكنه استيعاب أي معلومات). يمكن أن تكون المجموعة الحاملة (المجموعة الأساسية) المرتبطة بالنوع الأحادي أي مجموعة أحادية . يوجد تماثل بين أي مجموعتين من هذا النوع، لذا جرت العادة على الحديث عن النوع الأحادي وتجاهل تفاصيل قيمته. يمكن أيضًا اعتبار النوع الأحادي نوعًا من الأصفار ، أي ناتج ضرب لا أنواع.
يُعدّ نوع الوحدة الكائن النهائي في فئة الأنواع والدوال المُحددة النوع. يجب عدم الخلط بينه وبين النوع الصفري أو الفارغ ، الذي لا يسمح بأي قيم وهو الكائن الأولي في هذه الفئة. وبالمثل، فإنّ النوع المنطقي (Boolean) هو النوع الذي يقبل قيمتين .
يُستخدم نوع الوحدة في معظم لغات البرمجة الوظيفية . أما نوع الفارغة ، المستخدم في بعض لغات البرمجة الإجرائية، فيؤدي بعض وظائفه، ولكن نظرًا لأن مجموعة حاملاته فارغة، فإنه يعاني من بعض القيود (كما هو موضح أدناه).
في لغات البرمجة
توفر العديد من لغات برمجة الكمبيوتر نوع الوحدة لتحديد نوع نتيجة الدالة التي يكون الغرض الوحيد منها هو إحداث تأثير جانبي ، ونوع وسيط الدالة التي لا تتطلب وسائط.
- في لغات Haskell و Rust و Elm ، يتم استدعاء نوع الوحدة
()وقيمته الوحيدة هي أيضًا()، مما يعكس تفسير 0-tuple. - في اللغات المنحدرة من لغة ML (بما في ذلك OCaml و Standard ML و F# )، يتم استدعاء النوع
unitولكن يتم كتابة القيمة على النحو التالي(). - في لغة سكالا ، يُطلق على نوع الوحدة اسم
Unitويتم كتابة قيمته الوحيدة على النحو التالي(): . - في لغة Common Lisp، يُعدّ النوع المسمى NULL نوعًا أحاديًا له قيمة واحدة، وهي الرمز NIL . يجب عدم الخلط بينه وبين النوع NIL ، وهو النوع الأدنى .
- في لغة بايثون ، يوجد نوع يُسمى
NoneTypeيسمح بقيمة واحدة لـNone. في تعليقات النوع الثابتة الاختيارية في بايثون، يتم تمثيل هذا النوع على النحو التاليNone: . [ 1 ] - في لغة Swift ، يُطلق على نوع الوحدة اسم
Voidor()وقيمته الوحيدة هي أيضًا()، مما يعكس تفسير 0-tuple. - في لغة جافا ، يُطلق على نوع الوحدة اسم `
Voidtrue` وقيمته الوحيدة هي `true`null. لا يمكن إنشاء مثيل له. يُستخدم في الأنواع العامة للدلالة على أنواع الإرجاع لـ `true`void. - في لغة Go ، يتم كتابة نوع الوحدة
struct{}وقيمتها هيstruct{}{}. - في لغة PHP ، يُطلق على نوع الوحدة اسم null، وقيمته الوحيدة هي NULL.
- في لغة جافا سكريبت ، كل من
Null(قيمته الوحيدة هيnull) وUndefined(قيمته الوحيدة هيundefined) هما نوعان من أنواع الوحدات المضمنة. - في لغة Kotlin ،
Unitهو كائن أحادي القيمة له قيمة واحدة فقط:Unitالكائن. - في لغة روبي ،
nilهذا هو المثال الوحيد للفئةNilClass. - في لغة C++ ،
std::monostateتمت إضافة نوع الوحدة في الإصدار C++17 . قبل ذلك، كان من الممكن تعريف نوع وحدة مخصص باستخدام بنية فارغة مثلstruct Empty {}. - في لغة دارت ، كل
Nullمن السجل الفارغ (()، منذ دارت 3) له قيمة واحدة ممكنة، على التوالي،nullو().
نوع الفراغ كنوع وحدة
في لغات C و C++ و C# و D و PHP ، voidيُستخدم النوع `null` للدلالة على دالة لا تُرجع أي قيمة مفيدة، أو دالة لا تقبل أي وسيط. يُشابه النوع `null` في لغة C من حيث المفهوم النوع `null` struct، ولكن لا يُسمح باستخدام بنية بيانات بدون أعضاء في مواصفات لغة C (بينما يُسمح بذلك في C++). بدلاً من ذلك، voidيُستخدم `null` بطريقة تُحاكي بعض خصائص النوع `null`، وليس جميعها، كما هو مُفصّل أدناه. وكما هو الحال في معظم اللغات الإجرائية، تسمح لغة C بالدوال التي لا تُرجع قيمة؛ ويُشار إليها بنوع الإرجاع `void`. تُسمى هذه الدوال بالإجراءات في لغات إجرائية أخرى مثل باسكال ، حيث يتم التمييز بين الدوال والإجراءات بناءً على التركيب النحوي بدلاً من نظام الأنواع.
اختلاف في اصطلاح الاتصال
يتمثل أول فرق ملحوظ بين نوع الوحدة الحقيقي ونوع العدم في أن نوع الوحدة يمكن أن يكون دائمًا نوع وسيط الدالة، بينما لا يمكن أن يكون نوع العدم نوع وسيط في لغة C، على الرغم من أنه قد يظهر كوسيط وحيد في القائمة. ويتضح هذا الإشكال جليًا من خلال البرنامج التالي، الذي يمثل خطأً أثناء الترجمة في لغة C:
void f ( void ) {} void g ( void ) {}int main ( void ) { f ( g ()); // خطأ وقت الترجمة هنا return 0 ; }لا تظهر هذه المشكلة في معظم ممارسات البرمجة بلغة C، لأن voidالنوع لا يحمل أي معلومات، وبالتالي لا فائدة من تمريره؛ لكنها قد تظهر في البرمجة العامة ، مثل قوالب C++ ، حيث voidيجب التعامل مع النوع بشكل مختلف عن الأنواع الأخرى. مع ذلك، في C++، يُسمح بالفئات الفارغة، لذا من الممكن تنفيذ نوع وحدة حقيقي؛ يصبح المثال أعلاه قابلاً للترجمة كما يلي:
class UnitType {}; constexpr UnitType UNIT ;UnitType f ( UnitType ) noexcept { return UNIT ; }UnitType g ( UnitType ) noexcept { return UNIT ; }int main () { f ( g ( UNIT )); return 0 ; }للاختصار، UNITلم يتم تنفيذه كنمط أحادي ؛ انظر نمط النمط الأحادي لمزيد من الشرح حول الوحدات الأحادية.
اختلاف في التخزين
الفرق الملحوظ الثاني هو أن النوع void نوع خاص ولا يمكن تخزينه في نوع سجل ، أي في بنية أو فئة في لغتي C/C++. في المقابل، يمكن تخزين النوع unit في سجلات في لغات البرمجة الوظيفية، أي يمكن أن يظهر كنوع حقل؛ كما يمكن تخزين التنفيذ المذكور أعلاه للنوع unit في C++. مع أن هذه الميزة قد تبدو غير ضرورية، إلا أنها تسمح، على سبيل المثال، بتنفيذ مجموعة بشكل أنيق كخريطة للنوع unit ؛ وفي حال عدم وجود نوع unit، يمكن تنفيذ مجموعة بهذه الطريقة عن طريق تخزين قيمة وهمية من نوع آخر لكل مفتاح.
في الأدوية الجنيسة
Voidفي لغة جافا، يجب أن تكون معاملات النوع من أنواع مرجعية. ويُستخدم نوع الغلاف غالبًا عند الحاجة إلى معامل من نوع وحدة.
import java.util.concurrent.* ;ExecutorService executorService = Executors.newFixedThreadPool ( 2 ) ;CompletableFuture <Void> future = CompletableFuture.runAsync (() - > { try { // محاكاة بعض العمليات System.out.println ( "بدأت المهمة." ) ; Thread.sleep ( 2000 ) ; // محاكاة مهمة لمدة ثانيتين System.out.println ( " اكتملت المهمة." ); } catch ( InterruptedException e ) { System.err.println ( " تمت مقاطعة المهمة . " ) ; } } , executorService ) ;على الرغم من أن هذا Voidالنوع لا يمكن أن يحتوي على أي نسخ، إلا أنه يمتلك قيمة واحدة null(مثل جميع أنواع المراجع الأخرى)، لذا فهو يعمل كنوع وحدة. عمليًا، Mathيمكن استخدام أي نوع آخر غير قابل للنسخ، على سبيل المثال، لهذا الغرض أيضًا، لأنه يمتلك قيمة واحدة فقط null.
public static Void f ( Void x ) { return null ; }public static Void g ( Void x ) { return null ; }public static void main ( String [] args ) { f ( g ( null )); }نوع فارغ
تُحدد اللغات ذات الكتابة الثابتة نوعًا لكل تعبير ممكن. فهي تحتاج إلى ربط نوع بالتعبير null. سيتم تعريف نوع لكل تعبير null، ولن يكون له سوى هذه القيمة.
على سبيل المثال، في لغة D، من الممكن تعريف دوال لا يمكنها إلا إرجاع قيمة null(في الواقع، typeof(null)هي void):
typeof ( null ) returnThatSpecialThing () { return null ; }void writeTypeOfNull () { writeln ( typeof ( null )); // يطبع: void }nullهي القيمة الوحيدة التي typeof(null)يمكن أن يمتلكها نوع الوحدة.
انظر أيضاً
- أي نوع
- النوع السفلي
- نمط Singleton (حيث يكون لفئة معينة مثيل واحد فقط، ولكن عادةً لا تحتفظ الفئات الأخرى بمراجع غير قابلة للتصفير ذات أنواع ضيقة إليها)
- غير محدد
- نوع فارغ
ملحوظات
- ↑ فان روسوم، غيدو؛ ليفكيفسكي، إيفان. "PEP 483 - استخدام None" . مقترحات تحسين بايثون . مؤسسة برمجيات بايثون . تم الاطلاع عليه في 2 مارس 2024 .
مراجع
- بيرس، بنجامين سي. (2002). أنواع ولغات البرمجة . مطبعة معهد ماساتشوستس للتكنولوجيا . الصفحات 118-119 . ISBN 0-262-16209-1.
- نوع الوحدة في مختبر ن
- أنواع البيانات
- نظرية الأنواع
