يدعو الرأس والذيل في قائمة فارغة تجلب استثناء
-
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
المترجم يمكن ضمان أن يتم تغطية جميع الحالات الممكنة ، يتم تعريف القيم دائمًا وأنه منظف القراءة.