ما هي الاختلافات والتشابهات بين أنظمة نوع Scala و Haskell؟

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

  •  07-07-2019
  •  | 
  •  

سؤال

كيف تشرح نظام كتابة Scala لخبير هاسكل؟ما هي الأمثلة التي توضح مزايا سكالا؟

كيف يمكن شرح نظام نوع هاسكل لممارس سكالا المتقدم؟ما الذي يمكن القيام به في هاسكل ولا يمكن القيام به في سكالا؟

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

المحلول

Scala إلى مبرمج Haskell:

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

وظائف الدرجة الأولى هي أيضًا وحدات.الوظيفة هي وحدة نمطية لها طريقة مسماة apply.الطريقة ليست من الدرجة الأولى، ولكن يتم توفير بناء جملة لتغليف الطريقة في دالة من الدرجة الأولى.لسوء الحظ، تتطلب الوحدة جميع معلمات نوعها مقدمًا، وبالتالي لا يُسمح بقياس دالة من الدرجة الأولى مطبقة جزئيًا بشكل عام.بشكل أكثر عمومية، يفتقر Scala تمامًا إلى آلية مباشرة لأنواع الرتبة الأعلى من 1، ولكن يمكن استغلال الوحدات النمطية ذات المعلمات على الأنواع ذات التصنيف الأعلى لمحاكاة أنواع الرتبة n.

بدلاً من فئات الكتابة ذات النطاق العام، يتيح لك Scala الإعلان عن قيمة ضمنية لأي نوع محدد.يتضمن ذلك أنواع الوظائف، التي توفر تحويلاً ضمنيًا، وبالتالي نوع الامتداد.بالإضافة إلى التحويلات الضمنية، يتم توفير امتداد النوع من خلال آلية "التوسيع" التي تتيح لك الإعلان عن علاقة النوع الفرعي/النوع الفائق بين الوحدات.يمكن استخدام هذه الآلية لمحاكاة أنواع البيانات الجبرية حيث يمكن رؤية النوع الفائق باعتباره النوع الموجود على الجانب الأيسر من إعلان البيانات، وأنواعه الفرعية باعتبارها مُنشئات القيمة على الجانب الأيمن.يتمتع Scala بقدرات واسعة النطاق على مطابقة الأنماط باستخدام أداة مطابقة الأنماط الافتراضية مع أنماط من الدرجة الأولى.

يدعم Scala الكتابة الفرعية، وهذا يحد من استنتاج الكتابة إلى حد كبير.لكن استنتاج النوع قد تحسن بمرور الوقت.يتم دعم استنتاج الأنواع الأعلى.ومع ذلك، يفتقر سكالا إلى أي نظام نوعي ذي معنى، وبالتالي ليس لديه استدلال نوعي ولا توحيد نوعي.إذا تم تقديم متغير النوع، فهو من النوع * ما لم تتم الإشارة إلى خلاف ذلك.أنواع معينة مثل Any (النوع الفائق لجميع الأنواع) و Nothing (نوع فرعي من كل نوع) من الناحية الفنية كل نوع على الرغم من أنه لا يمكن تطبيقها على وسائط الكتابة.

هاسكل إلى مبرمج Scala:

هاسكل هي لغة وظيفية بحتة.وهذا يعني أنه لا يُسمح للوظائف أن يكون لها أي آثار جانبية على الإطلاق.على سبيل المثال، لا يقوم برنامج Haskell بالطباعة على الشاشة على هذا النحو، ولكنه دالة تُرجع قيمة IO[_] نوع البيانات الذي يصف سلسلة من الإجراءات التي يجب على نظام الإدخال والإخراج الفرعي تنفيذها.

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

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

تسمح الامتدادات الحديثة لمترجم GHC بميزات نظام الكتابة المتقدمة التي ليس لها ما يعادلها في Scala، مثل أنواع rank-n وعائلات الكتابة وتعدد الأشكال.

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

نظرًا لأن هاسكل ليس "موجهًا للكائنات"، فلا يوجد انقسام بين الطريقة والوظيفة.كل وظيفة هي من الدرجة الأولى ويتم تنفيذ كل وظيفة بشكل افتراضي (لا توجد وظيفة 1، وظيفة 2، وما إلى ذلك).

ليس لدى هاسكل آلية للأنواع الفرعية، لكن فئات الكتابة يمكن أن يكون لها علاقة فئة فرعية.

نصائح أخرى

لا أعتقد أن أي شخص قد مقارنة منهجية هاسكل (كما يتضح من نظام نوع الخليج القابضة) مع Scalas. النقاط الرئيسية من الفرق هي درجة من نوع الاستدلال، ودعم لأنواع رتبة أعلى. ولكن العلاج الكامل للاختلافات سيكون نتيجة للنشر.

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