نوع المنتج

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

إذا كان هناك نوعان فقط من المكونات، فيمكن تسميته "نوعًا مزدوجًا". على سبيل المثال، إذا كان هناك نوعان من المكوناتأ{\displaystyle A}وب{\displaystyle B}هي مجموعة جميع القيم الممكنة لهذا النوع، نوع المنتج المكتوبأ×ب{\displaystyle A\times B}يحتوي على عناصر على شكل أزواج(أ،ب){\displaystyle (a,b)}، أينأ{\displaystyle a}وب{\displaystyle b}أمثلة علىأ{\displaystyle A}وب{\displaystyle B}على التوالي. يُعد نوع الزوج حالة خاصة من نوع الزوج التابع ، حيث يكون النوعب{\displaystyle B}قد يعتمد ذلك على الحالة المختارة منأ{\displaystyle A}.

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

في تطابق كاري-هوارد ، ترتبط أنواع المنتجات بالاقتران المنطقي ( و ) في المنطق .

يمتد هذا المفهوم مباشرةً إلى حاصل ضرب عدد محدود من الأنواع (anن{\displaystyle n}يُشير نوع المنتج (-ary product type) في هذه الحالة إلى التعبيرات التي تتصرف كصفوف من التعبيرات من الأنواع المقابلة. أما النوع الأحادي فهو شكل مُنحط من نوع المنتج ، وهو ناتج ضرب لا أنواع .

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

تحتوي معظم لغات البرمجة الوظيفية على مفهوم بدائي لنوع المنتج. على سبيل المثال، المنتجتي1×تي2×...×تين{\displaystyle T_{1}\times T_{2}\times ...\times T_{n}}تُكتب بلغة ML ولغة Haskell . في كلتا اللغتين، تُكتب المجموعات (tuples) وتُستخرج مكونات المجموعة عن طريق مطابقة الأنماط . بالإضافة إلى ذلك، توفر العديد من لغات البرمجة الوظيفية أنواع بيانات جبرية أكثر عمومية ، والتي تُوسّع كلاً من أنواع الضرب والجمع . أنواع الضرب هي النوع المقابل لأنواع الجمع.T1 * T2 * ... * Tn(T1, T2, ..., Tn)(v1, v2, ..., vn)

أنواع المنتجات في لغات البرمجة

  • تُعرّف لغة C++ الفئة std::tuple(المُعبَّر عنها tuple<Ts...>باستخدام قوالب متغيرة الوسائط[ 1 ] وفي حالة وجود عنصرين، تُعرّف std::pair(المُعبَّر عنها pair<T, U>). [ 2 ]std::tuple ويمكن أن تكون فارغة ( tuple<>).
  • يُعرّف إطار عمل C# / .NET الفئة System.Tuple. توجد نسخ مُخصصة من الفئة لعناصر تتراوح من 1 إلى 8 عناصر. في حالة عنصرين (زوج)، يتم استخدام [ 3 ]Tuple<T1, T2> . لإنشاء مجموعة من تسعة عناصر أو أكثر، يتم تمرير المعامل الأخير للفئة كمجموعة أخرى. [ 4 ]. للتكرار على المجموعات مثل أنواع القواميس، يتم توفير الفئة (المُعبر عنها بـ ). [ 5 ]TRestTuple<T1, T2, T3, T4, T5, T6, T7, TRest>System.Collections.Generic.KeyValuePairKeyValuePair<TKey, TValue>
  • لا تحتوي لغة Go على نوع tuple، ولكنها تستطيع التعبير عن قيم الإرجاع المتعددة في دالة كنوع من أنواع tuple. [ 6 ]
  • تحتوي لغة هاسكل على نوع بيانات Data.Tuple. [ 7 ]
  • لا تحتوي لغة جافا على نوع بيانات عام للصفوف، ولكن JavaFX تحتوي على نوع بيانات javafx.util.Pair(يُعبّر عنه بـ Pair<K, V>). [ 8 ] عند التكرار على الحاويات الترابطية مثل java.util.Map، يُعبّر عن الزوج في الخريطة بـ Map.Entry<K, V>. [ 9 ]
  • لا تحتوي لغة Kotlinkotlin.Pair على نوع tuple عام، ولكنها تحتوي على فئات (expressed Pair<A, B>) [ 10 ] و kotlin.Triple(expressed Triple<A, B, C>). [ 11 ]
  • تحتوي لغة بايثونtuple على مجموعة يمكن شرحها على النحو التالي typing.Tuple(معبر عنها ). [ 12 ]Tuple[T1, T2, ..., TN]
  • تُعرّف لغة Rust نوع tuple الأولي، والذي يُعبّر عنه بـ ، والزوج هو ببساطة . [ 13 ](T1, T2, ..., TN)(T, U)
  • تُعرّف لغة سكالاscala.Tuple الفئة [ 14 ] التي تدعم ما بين 2 و22 كائنًا على النحو التالي scala.Tuple2(معبرًا عنها بـ Tuple2[A, B]) [ 15 ] إلى scala.Tuple22(معبرًا عنها بـ Tuple22[A, B, ..., V]). [ 16 ]
  • تُعبّر لغة Swift عن المجموعات على النحو التالي : [ 17 ](T1, T2, ..., TN)

انظر أيضاً

مراجع

  1. "std::tuple" . cppreference.com . تم الاطلاع عليه بتاريخ 14 أكتوبر 2025 .
  2. "std::pair" . cppreference.com . تم الاطلاع عليه بتاريخ 14 أكتوبر 2025 .
  3. "فئة الصف" . learn.microsoft.com . مايكروسوفت ليرن . تم الاطلاع عليه بتاريخ 14 أكتوبر 2025 .
  4. "فئة Tuple<T1, T2, T3, T4, T5, T6, T7, TRest>" . learn.microsoft.com . Microsoft Learn . تم الاطلاع عليه بتاريخ 14 أكتوبر 2025 .
  5. "بنية KeyValuePair<TKey, TValue>" . learn.microsoft.com . مايكروسوفت ليرن . تم الاطلاع عليه بتاريخ 14 أكتوبر 2025 .
  6. "Effective Go - Functions - Multiple return values" . go.dev . Retrieved 14 October 2025 .
  7. "Data.Tuple" . hackage.haskell.org . تم الاطلاع عليه بتاريخ 14 أكتوبر 2025 .
  8. "Class Pair<K, V>" . download.java.net . شركة أوراكل . تم الاطلاع عليه بتاريخ 14 أكتوبر 2025 .
  9. "Interface Map.Entry<K, V>" . docs.oracle.com . شركة أوراكل . تم الاطلاع عليه بتاريخ 14 أكتوبر 2025 .
  10. "زوج" . kotlinlang.org . JetBrains sro . تم ​​الاسترجاع في 14 أكتوبر 2025 .
  11. "Triple" . kotlinlang.org . JetBrains sro . تم ​​الاطلاع عليه بتاريخ 14 أكتوبر 2025 .
  12. "5. هياكل البيانات" . docs.python.org . تم الاطلاع عليه بتاريخ 14 أكتوبر 2025 .
  13. "tuple - Rust" . doc.rust-lang.org . تم الاطلاع عليه بتاريخ 14 أكتوبر 2025 .
  14. "Tuple" . www.scala-lang.org . تم الاطلاع عليه بتاريخ 14 أكتوبر 2025 .
  15. "Tuple2" . www.scala-lang.org . تم الاطلاع عليه بتاريخ 14 أكتوبر 2025 .
  16. "Tuple22" . www.scala-lang.org . تم الاطلاع عليه بتاريخ 14 أكتوبر 2025 .
  17. "توثيق الأنواع" . docs.swift.org . شركة آبل . تم الاطلاع عليه بتاريخ 14 أكتوبر 2025 .