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