يدعو الرأس والذيل في قائمة فارغة تجلب استثناء

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

  •  30-09-2019
  •  | 
  •  

سؤال

أنا أتابع برنامج تعليمي. (العالم الحقيقي هاسكل)

ولدي سؤال مبتدئ واحد حول Head and Tail يسمى قوائم فارغة: في GHCI ، يعيد استثناء.

بشكل حدسي أعتقد أنني سأقول إنه يجب على كلاهما إعادة قائمة فارغة. هل يمكن أن تصححني؟ لما لا ؟ (بقدر ما أتذكر في Ozml اليسار أو يمين قائمة فارغة تُرجع لا شيء)

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

أنا أعرف فقط سلوك GHCI ، لا أعرف ما يحدث عند تجميعه.

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

المحلول

أعتقد أنه سيقول إنه يجب على كلاهما إعادة قائمة فارغة. هل يمكن أن تصححني؟ لما لا ؟

نحن سوف - head هو [a] -> a. يعيد العنصر الفردي الأول ؛ لا قائمة.

وعندما لا يوجد عنصر أول مثل في قائمة فارغة؟ حسنا ماذا تعود؟ لا يمكنك إنشاء قيمة النوع a من لا شيء ، لذلك كل ما تبقى undefined - خطا.


و tail؟ Tail هي أساسًا قائمة بدون عنصرها الأول - أي عنصر واحد أقصر من العنصر الأصلي. لا يمكنك دعم هذه القوانين عندما لا يكون هناك عنصر أول.

عندما تخرج تفاحة واحدة من صندوق ، لا يمكنك الحصول على نفس المربع (ما حدث عندما tail [] == []). يجب أن يكون السلوك undefined جدا.


هذا يؤدي إلى الاستنتاج التالي:

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

نعم ، إنه مصدر لبق ، ولكن لأنه يسمح بكتابة التعليمات البرمجية المعيبة. الكود الذي يحاول أساسا قراءة قيمة غير موجودة. لذلك:*لا تستخدم أبدًا الرأس/الذيل ** - استخدم مطابقة الأنماط.

sum     [] = 0
sum (x:xs) = x + sum xs

المترجم يمكن ضمان أن يتم تغطية جميع الحالات الممكنة ، يتم تعريف القيم دائمًا وأنه منظف القراءة.

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