समस्या - जब आप हास्केल सीख रहे हैं तो कई अन्य लोगों की तरह - टाइपिंग में से एक है। GHCi
:t mylast
में निम्न टाइप करें और आप देखेंगे कि प्रकार हस्ताक्षर
mylast :: [[a]] -> [a]
जो सूचियों की एक सूची अपेक्षा करता है और एक सूची प्रदान करेगा है। तो यदि आप तारों की सूची ["बॉब", "बाड़", "घर"] में डालते हैं तो फ़ंक्शन काम करेगा जैसा आपने लिखा है।
समस्या आपका आधार मामला है: mylast [] = [], जो संकलक को बताता है कि आप एक सूची वापस करना चाहते हैं। आप एक तत्व नहीं, एक सूची वापस करना चाहते हैं। लेकिन हास्केल में बहुत खाली तत्व नहीं है (डिजाइन द्वारा बहुत अधिक), इसलिए आपको शायद मोनड का उपयोग करने की आवश्यकता है।
mylast :: [a] -> Maybe a
mylast [] = Nothing
mylast (x:[]) = Just x
mylast (x:xs) = mylast xs
monads कुछ हद तक एक अमूर्त विषय हैं, लेकिन आप जब तुम बाहर शुरू कर रहे हैं हो सकता है कि इकाई की जरूरत है। आपको इसके बारे में जानने की जरूरत है कि यह एक प्रकार की घोषणा है जो संकलक को दो संभावनाओं की अपेक्षा करने के लिए कहती है: "कुछ भी नहीं," या "बस एक्स"। रिटर्निंग कोड तब एक्स ले सकता है और इसके साथ चला सकता है, लेकिन अगर आप "बस" छोड़ देते हैं, तो संकलक शिकायत करेगा।
विकल्प तो की तरह, एक खाली सूची का सामना करना पड़ा है, जब एक त्रुटि फेंक करने के लिए है:
mynextlast [] = error "no empty lists allowed"
mynextlast (x:[]) = x
mynextlast (x:xs) = mynextlast xs
लेकिन मेरे संदेह है कि हो सकता है कि जाने का रास्ता है।
आप rtperson जवाब को स्वीकार करना चाहिए ... – yeyeyerman