ماذا يعني "عدم الاستدلال العالمي" فيما يتعلق بالسكالا؟

StackOverflow https://stackoverflow.com/questions/4304003

سؤال

لقد قرأت أن استنتاج نوع Scala ليس عالميًا ، ولهذا السبب يجب على الناس وضع تعليقات من النوع على الأساليب. (هل سيكون هذا الاستدلال "المحلي"؟)

أنا فقط أفهم قليلاً أن السبب هو من طبيعتها الموجهة نحو الكائن ، لكن الوضوح يصرخني. هل هناك تفسير لـ "الاستدلال العالمي" ولماذا لا يمكن أن يفهم Scala المبتدئ؟

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

المحلول

المثال النموذجي لاستدلال النوع العالمي هو هيندلي ميلنر: يستغرق برنامج معين و "يحسب" جميع الأنواع اللازمة. ومع ذلك ، من أجل تحقيق ذلك ، تحتاج اللغة المحددة إلى الحصول على بعض الخصائص (هناك امتدادات لـ HM ، التي تحاول التغلب على بعض هذه القيود). شيئان لا يعجبهما HM هما الميراث والطريقة الزائدة. بقدر ما أفهم ، فهذه هي العقبات الرئيسية التي تتبعها سكالا لتبني HM أو بعض المتغيرات منه. لاحظ أنه في الممارسة العملية حتى اللغات التي تعتمد بشكل كبير على HM لا تصل أبدًا إلى استدلال 100 ٪ ، على سبيل المثال ، حتى في Haskell ، فأنت بحاجة إلى تعليق من النوع لآخر.

لذلك تستخدم Scala نموذجًا محدودًا (كما تقول "محلي") من الاستدلال النوع ، والذي لا يزال أفضل من لا شيء. بقدر ما أستطيع أن أخبر فريق Scala يحاول تحسين النوع من الاستدلال من الإصدار إلى الإصدار عندما يكون ذلك ممكنًا ، لكن حتى الآن رأيت خطوات أصغر فقط. لا تزال الفجوة إلى نوع HM على غرار الاستدلال ضخمة ، ولا يمكن إغلاقها تمامًا.

نصائح أخرى

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

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

يعمل استدلال Scala بشكل أساسي من الخارج (تعريف الطريقة) إلى الداخل (رمز داخل الطريقة) وبالتالي يحد من تأثير شرح النوع الخاطئ.

تعمل اللغات ذات الاستدلال HM من الداخل إلى الخارج (تجاهل إمكانية إضافة تعليقات من النوع) مما يعني أن هناك فرصة لتغيير رمز صغير في طريقة واحدة يمكن أن يغير معنى البرنامج بأكمله. وهذا يمكن أن تكون جيدة أو سيئة.


المرجع: Lower bounds on type inference with subtypes

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