لغة البرمجة هاسكل والصرامة الرياضياتية
يُشار عادة إلى لغة البرمجة هاسكل على أنها اللغة الأكثر صرامة بين بقية لغات البرمجة حتى أنها توصف بشائعة خاطئة: "لن تستطيع كتابة كود عبر هاسكل من غير أن تكون لديك دكتوراة في الرياضيات"، وذلك يرجع إلى بنيتها وخصائصها، هذه الخصائص تجذب الرياضياتيين والأشخاص المهتمين بالأساليب المنطقية، من هذه الخصائص:
1) هاسكل لغة وظيفية نقية Purely Functional، أن تكون اللغة وظيفية يعني ألا يحتوي برنامجك بما فيه من دوال على عوارض جانبية Side Effects، فكل دالة إذا ما أُعطيت المتغيرات ذاتها فإنها سوف تعطي ذات المخرجات، وذا يعكس مفهوم الدالة الرياضي، ويجعل التمنطق حول البرامج Reasoning about Programs أمرا أكثر استقامة
تندرج اللغات الوظيفية تحت نموذج أعم يسمى البارادايم التصريحي Declarative Paradigm، أما النموذج الآخر المسمى بالإلزامي Imperative Paradigm يشكو من مساوئ لا تشكو منها هاسكل، مثل العوارض الجانبية.
2) تعتمد نظامَ كتابة قوي Strong Static Typing بالإضافة إلى القدرة على استنباط الأنماط Type Inference، مما يجعل القبض على الأخطاء البرمجية أمرا سهلا وقتَ الترجمة Compilation time بدل وقت التشغيل Runtime، ومع القدرة على الاستنباط فبوسع المترجم Compiler أن يحدد أنماط القيم والمتغيرات من غير أن يعلن Declare عنها المبرمج صراحةً في الكود.
تعتمد لغة بايثون -مثلا- الكتابةَ الديناميكية Dynamic typing، وهي بذلك تفتح المجال وسيعا أمام أخطاء لن تظهر إلا وقت التشغيل.
مشكلة العوارض الجانبية تنشأ من أن طبيعة البرامج حالاتية Stateful، مما يعني أن الدوال أو الإجراءات تغيّر حالة البرنامج دوريًّا، ففي النموذج الإلزامي الذي تتفادى هاسكل أخطاءه، يشتغل منطق البرنامج عبرَ قيمة معينة أو متغير x تعلن عنه، ثم تضيف إليه واحدا آخر، فتطرح النتيجة في دالة أخرى...إلخ. وهذا يجعل التمنطق حول البرامج أمرا شاقا، لأن المخرجات رهن بالمدخلات وبحالة البرنامج الحالية.
3) تعتمد خاصية التثمين الكسول Laziness-Lazy Evaluation، وهذي استراتيجية بموجبها تنفذ اللغةُ التعبيراتِ Expressions عند الضرورة فقط، مما يؤدي إلى كود فعَّال ويسمح باستخدام بنى البيانات اللانهائية Infinite data structures. أما في النموذج الإلزامي فإن التعبيرات قاطبةً تُنَفذ عند أقرب زمن، بل وأحيانا تُنفذ فور التعرض لها بغض النظر عن الضرورة.
4) تقوم على أساسات رياضية، ففي حين أن اللغات الإلزامية تعتمد بنية فون نيومان، وإذن فهنالك خطوات، وعمليات، وتغييرات في الحالة. فإن جذور هاسكل تعود إلى حساب لامدا Lambda Calculus.
5) تتبنى نظرية الفئة Category theory، تحوي هاسكل العديدَ من المفاهيم المجلوبة من نظرية الفئة، مثل المدلال Functor، والموناد Monad، والمونويد Monoid، مما يعني أنها تبني البيانات وتتلاعب بها من خلال أصناف بنى جبرية Algebraic Data Types-ADTs.
6) احتوائها دوال الرتب العالية High-Order Functions، التي تمثل مفهوم قبول الدالة لدوال أخرى في جسمها، أي بدل أن تكون مدخلات الدالة -مثلا- متغيرات، تكون دالة أخرى قائمة بذاتها، وإذن ممكنٌ إصدار الدالة كمخرج Output. حاولت لغات النموذج الإلزامي محاكاة هذه الفكرة كما حاولت محاكاة غيرها مما لدى هاسكل وسائر النموذج التصريحي، إلا أن تفوق اللغات الوظيفية لا زال ظاهرا.