تعلم Haskell: كيفية تنفيذ نسختي الخاصة من وظيفة INT

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

  •  20-09-2019
  •  | 
  •  

سؤال

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

هنا هو ما فعلته حتى الآن.

init' :: [Int] -> [Int]
init' [] = error "This function cannot be applied to an empty list"
init' [x] = [x]
init' (x:xs) = x : init' xs
هل كانت مفيدة؟

المحلول

مشكلتك هي حالتك الأساسية. هنا:

init' [x] = [x]

أنت تقول أنه عند النزول إلى قائمة بعنصر واحد فيه، تريد إرجاع هذه القائمة نفسها. هذه ليست النتيجة المرجوة. عندما يكون لديك قائمة مع عنصر واحد فقط، فأنت ترغب في إرجاع قائمة فارغة (كل ذلك، لكن العنصر الأخير لعنصر واحد هو قائمة فارغة).

init' [x] = []

في ملاحظة جانبية، ربما يجب أن تعلن عنه

init' :: [a] -> [a]

باستخدام "A" كنوع تعميمه إلى قوائم أي شيء، على عكس Ints فقط. بهذه الطريقة يمكنك الاتصال بالتنصية "على أي نوع من القائمة. على سبيل المثال INIT '"ABCDE" من شأنه أن يمنحك "ABCD"

نصائح أخرى

قضيتك الثانية يجب أن تكون:

init' [x] = []

عندما تحتوي القائمة على عنصر واحد فقط، فمن الأخير، لذلك القائمة دون العنصر الأخير هي مجرد قائمة فارغة.

init' [x] = [x]

هذا غير صحيح. إذا قمت بإزالة العنصر الأخير من قائمة العناصر واحدا، فلن تعود إلى نفس القائمة، فستحصل على قائمة فارغة.

هنا هو إصدار بلدي جرب هذا.

init' :: [a] -> [a]

init' []  = error("This is not right, empty list is not allowed here")
init' (x:[]) = [x]
init' (x:xs:[]) = [x]
init' (x:xs) = x: init' xs
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top