البرمجة

حل مشكلة المتغير غير المعرف في Haskell

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

في الواقع، الدالة f تقبل حاليًا زوجًا من الأزواج، ولكن يبدو أنك تريد استخدام قيمة من الزوج الداخلي في الزوج الخارجي. لتصحيح هذا، يمكنك استخدام التعبير let لتعريف المتغيرات المحلية داخل f.

في الكود المصحح أدناه، قمت بإصلاح هذا الخطأ عن طريق استخدام let لتحديد قيم h1 و h2 و sofar في كل تكرار من تكرارات الطيّ للقائمة المدخلة.

haskell
main = interact $ show . maxsubseq . map read . words maxsubseq :: (Ord a, Num a) => [a] -> (a, [a]) maxsubseq = snd . foldl f ((0, []), (0, [])) where f ((h1, h2), sofar) x = (a, b) where (h1', h2') = let (a', b') = h1 in max (0, []) (a' + x, h2 ++ [x]) a = (h1', h2') b = max sofar a

تم تعديل الكود لتضمين let داخل f لتحديد قيم h1' و h2' بناءً على القيم المحسوبة سابقًا لـ h1 و h2. هذا يحل المشكلة بالنسبة لنطاق المتغيرات ويجعل الكود يتناسب مع النوع المتوقع.

المزيد من المعلومات

بموضوع مهم يتعلق بلغة البرمجة Haskell والمشكلة الشائعة “المتغير ليس في النطاق”، يتعين علينا فهم أسباب هذه المشكلة وكيفية تصحيحها بشكل فعّال.

فهم المشكلة

عندما نتلقى رسالة خطأ “المتغير ليس في النطاق” في Haskell، فإن هذا يشير إلى أن المتغير المستخدم في الكود لم يتم تعريفه في النطاق الحالي. يمكن أن يحدث هذا لعدة أسباب، ولكن في الحالة التي طُرحت في السؤال، السبب يعود إلى كيفية استخدام المتغيرات داخل الدوال.

الحل الصحيح

لحل هذه المشكلة، يجب تأكيد أن جميع المتغيرات المستخدمة في دوالنا معروفة في النطاق الذي يتم استدعاء هذه الدوال منه. في الحالة المذكورة، يمكننا استخدام التعبير let لتعريف المتغيرات المحلية داخل الدالة f بشكل صحيح.

التعديل على الكود

باستخدام التعليمات المذكورة أعلاه، يمكن تعديل الكود كما يلي:

haskell
main = interact $ show . maxsubseq . map read . words maxsubseq :: (Ord a, Num a) => [a] -> (a, [a]) maxsubseq = snd . foldl f ((0, []), (0, [])) where f ((h1, h2), sofar) x = (a, b) where (h1', h2') = let (a', b') = h1 in max (0, []) (a' + x, h2 ++ [x]) a = (h1', h2') b = max sofar a

الختام

باستخدام هذا التعديل، يجب أن تتمكن الآن من تشغيل الكود بدون أخطاء “المتغير ليس في النطاق”. يظهر هذا المثال كيف يمكن استخدام التعبيرات المحلية مثل let لتعريف المتغيرات في النطاق الصحيح، وبالتالي تفادي الأخطاء الشائعة في لغة Haskell.

زر الذهاب إلى الأعلى