عند تحليل الخطأ الذي تواجهه في الكود المذكور، يبدو أن المشكلة تكمن في نطاق المتغيرات. الأخطاء التي تظهر تشير إلى أن المتغيرات المستخدمة في دالة f
ليست في النطاق الصحيح.
في الواقع، الدالة f
تقبل حاليًا زوجًا من الأزواج، ولكن يبدو أنك تريد استخدام قيمة من الزوج الداخلي في الزوج الخارجي. لتصحيح هذا، يمكنك استخدام التعبير let
لتعريف المتغيرات المحلية داخل f
.
-
الحصول على القيمة القصوى + 1 في SQL Server28/03/2024
-
تصحيح استخدام RegExp في JavaScript replace30/03/2024
-
Script to Find and Replace Values in Files30/03/2024
-
تقسيم النصوص في Python24/03/2024
في الكود المصحح أدناه، قمت بإصلاح هذا الخطأ عن طريق استخدام let
لتحديد قيم h1
و h2
و sofar
في كل تكرار من تكرارات الطيّ للقائمة المدخلة.
haskellmain = 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
بشكل صحيح.
التعديل على الكود
باستخدام التعليمات المذكورة أعلاه، يمكن تعديل الكود كما يلي:
haskellmain = 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.