سؤال

لنفترض أن لديك 3 أشياء ، عالمية MemoryStore, ، والتي لديها مجموعة من MemorySlabCache الكائنات ، وكل MemorySlabCache لديه مجموعة من MemorySlab الأشياء. نوع من مثل هذا:

class MemoryStore {
  caches: Array<MemorySlabCache> = []
}

class MemorySlabCache {
  size: Integer
  slabs: Array<MemorySlab> = []
}

class MemorySlab {
  
}

لكن الشيء هو أن هذا لا يلتقط كل شيء.كما يحتاج إلى التقاط حقيقة أن كل MemorySlabCache لديه حجم ، والذي يستخدم لمعرفة ما حجم MemorySlab الكائنات هي أنه يحتوي على.لذلك هو المزيد مثل هذا:

class MemoryStore {
  caches: Array<MemorySlabCache> = []
}

class MemorySlabCache {
  size: Integer
  slabs: Array<MemorySlab<size>> = []
}

class MemorySlab<size: Integer> {
  
}

ثم نقوم بإنشاء مخابئنا:

let 4bytes = new MemorySlabCache(size: 4)
let 8bytes = new MemorySlabCache(size: 8)
...
let 32bytes = new MemorySlabCache(size: 32)
...
store.caches.push(4bytes, 8bytes, ..., 32bytes, ...)

هل هذا يعتبر "نوع تابع", "نوع يعتمد تعريفه على قيمة"?منذ نوع من Array<MemorySlab<size>> يعتمد على القيمة المخصصة ل size الميدان على MemorySlabCache.ان لم, ما هذا?ما من شأنه أن يجعل من مثال على أنواع تعتمد?

هل كانت مفيدة؟

المحلول

لذا ، يمكن القول إن الإجابة هي " نعم " ، وهذا مثال على الأنواع التابعة.ومع ذلك ، فإن المشكلة مع الكثير من الأمثلة البسيطة التي يخلقها الناس لهذا هو أنها لا تظهر جوانب غير تافهة من الكتابة التابعة.

يمكن القول إن لك أفضل في هذا الصدد ، لأن النوع المعني يعتمد على قيمة عشوائية في MemorySlabCache.ومع ذلك ، لا تستخدم أبدا MemorySlabCache بدون قيمة معروفة بشكل ثابت.لذا فإن المثال الأكثر إثارة للاهتمام سيكون مثل:

let cacheSize = readInteger(stdin)
store.caches.push(new MemorySlabCache(cacheSize))

لذلك ، تسمح للمستخدم بتحديد حجم ذاكرة التخزين المؤقت في وقت التشغيل ، ولكن لا يزال حجم ذاكرة التخزين المؤقت مسجلا في النوع ، ويضمن مدقق النوع بشكل ثابت أن جميع العمليات منطقية فيما يتعلق بالحجم ، على الرغم من أن الحجم غير معروف بشكل ثابت (وهو نوع من مشكلة أخرى مع المثال الخاص بك;لا شيء في ذلك يظهر كيف يهم حجم تعقب في وقت لاحق).

وهناك مشكلة أكثر طفيفة إلى حد ما هي أن الأعداد الصحيحة هي بنية سهلة جدا لأنواع تعتمد على 'وهمية' ل ، لذلك أمثلة معهم في نهاية المطاف تحت بيع ما قد يكون ممكنا مع أنواع تعتمد حقيقية.على سبيل المثال ، هاسكل مع بعض الملحقات يمكن ترميز حتى شيء مماثل لمثال وقت التشغيل-حجم ذاكرة التخزين المؤقت ، على الرغم من أنه ليس لديها حقا أنواع تابعة.يمكن أن يكون لديك أعداد صحيحة على مستوى النوع معروفة بشكل ثابت ، وإنشاء وظيفة تمنحك قيمة مناسبة لقيمة مكتوبة بشكل ثابت استنادا إلى عدد صحيح وقت التشغيل.ومع ذلك ، فإن اللغات القائمة على نظرية النوع المعتمد تسمح عموما للأنواع بالاعتماد على قيم الأنواع التعسفية ، مثل أنواع الوظائف.لهذه (وغيرها من الميزات ذات الصلة) ، 'تزوير' ليس ممكنا حقا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى cs.stackexchange
scroll top