سؤال

لقد قرأت أن نظام نوع Scala يضعف بواسطة قابلية التشغيل البيني Java وبالتالي لا يمكن أن تؤدي بعضًا من نفس القوى كنظام نوع Haskell. هل هذا صحيح؟ هل الضعف بسبب محو النوع ، أم أنني مخطئ بكل الطرق؟ هل هذا الاختلاف هو السبب في أن سكالا لا يوجد لديه طعم؟

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

المحلول

الفرق الكبير هو أن Scala ليس لديها استدلال على النوع Hindley-Milner Global وبدلاً من ذلك يستخدم شكل من أشكال الاستدلال المحلي ، مما يتطلب منك تحديد أنواع معلمات الطريقة ونوع الإرجاع للوظائف المحملة أو العودية.

هذا ليس مدفوعًا بمحو النوع أو متطلبات أخرى من JVM. يمكن التغلب على جميع الصعوبات الممكنة هنا ، وقد تم التفكير في Jaskell - فقط http://docs.codehaus.org/display/jaskell/home

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

ليس من الجيد حقًا الإشارة إلى أن Haskell أو Scala لديهما نظام أقوى من النوع ، فقط أنهما مختلفان. تدفع كلتا اللغتين الحدود للبرمجة المستندة إلى النوع في اتجاهات مختلفة ، وكل لغة لديها نقاط قوة فريدة يصعب تكرارها في الآخر.

نصائح أخرى

يختلف نظام نوع Scala عن Haskell's ، على الرغم من أن مفاهيم Scala مستوحاة أحيانًا من نقاط القوة في Haskell ومجتمعها المطلع على الباحثين والمهنيين.

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

بقدر ما أعرف "التسوية" الوحيدة على مستوى نظام النوع مع Java هو بناء جملة خاصة للتعامل مع الأنواع الأولية. على الرغم من أن Scala لا تسمح حتى بأنواع RAW بعد الآن ، إلا أنها تقبل ملفات فئة Java الأقدم مع هذا الخطأ. ربما رأيت رمزًا مثل List[_] (أو ما يعادل أطول List[T] forSome { type T }). هذه ميزة التوافق مع Java ، ولكن يتم التعامل معها كنوع وجودي داخليًا أيضًا ولا تضعف نظام النوع.

نظام نوع Scala يدعم اكتب الفصول, ، على الرغم من بطريقة أكثر مطوّلة من هاسكل. أقترح قراءة هذه الورقة ، والتي قد تخلق انطباعًا مختلفًا عن القوة النسبية لنظام نوع Scala (الجدول في الصفحة 17 يعمل كقائمة لطيفة لمفاهيم نظام النوع القوية للغاية).

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

في نهاية نظام Scala's و Haskell ، يحركه الرغبة في تزويد مستخدميها بأفضل الأدوات لحل مشاكلهم ، ولكنها اتخذت مسارات مختلفة لهذا الهدف.

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

سكالا ليس لديها أنواع الرتبة N., ، على الرغم من أنه قد يكون من الممكن العمل حول هذا القيد في بعض الحالات.

ليس لدي سوى القليل من التجارب مع Haskell ، لكن الشيء الأكثر وضوحًا الذي لاحظته أن نظام نوع Scala يختلف عن Haskell هو الاستدلال النوع.

في Scala ، لا يوجد أي نوع عالمي للاستدلال ، يجب عليك أن تخبر نوع وسيطات الوظائف.

على سبيل المثال ، في Scala ، تحتاج إلى كتابة هذا:

def add (x: Int, y: Int) = x + y

بدلاً من

add x y = x + y

قد يتسبب هذا في مشكلة عندما تحتاج إلى إصدار عام من وظيفة ADD التي تعمل مع جميع أنواع النوع لها طريقة "+". هناك حل بديل لهذا ، لكنه سيحصل على المزيد من المطورين.

لكن في الاستخدام الحقيقي ، وجدت أن نظام نوع Scala قوي بما يكفي للاستخدام اليومي ، وأنا لا أستخدم أبدًا هذه الحل البديل ، وربما هذا لأنني أتيت من عالم Java.

والقيود على الإعلان الصريح أن نوع الحجج ليس ضروريًا شيئًا سيئًا ، فأنت بحاجة إلى توثيقه على أي حال.

حسنا هل هم turing مخفض؟

انظر صفحة Oleg Kiselyov http://okmij.org/ftp/... يمكن للمرء تنفيذ حساب التفاضل والتكامل Lambda في نظام نوع Haskell. إذا تمكنت Scala من القيام بذلك ، فعندئذٍ ، فإن نظام نوع Haskell ونظام Scala يحسب نفس الأنواع. الأسئلة هي: ما مدى طبيعية على الآخر؟ ما مدى أناقة واحدة على الآخر؟

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