2009-07-29 17 views
7

मैं खुद को हास्केल सिखाने की कोशिश कर रहा हूं। एक चीज जिसे मैंने करने की कोशिश की है, सूची के माध्यम से सूची के माध्यम से एक सूची के अंतिम तत्व को वापस करने के लिए एक वैकल्पिक कार्य लिखना है जब तक कि पूंछ खाली सेट न हो और फिर सिर लौट जाए। मुझे लगता है मैं गलत क्या किया है के रूप में है ...अंतिम कार्य को कार्यान्वित करना

mylast [] = [] 
mylast (x:[]) = x 
mylast (x:xs) = mylast xs 

... लेकिन जब मैं किसी भी गैर खाली सूची की कोशिश मैं कोई त्रुटि मिलती है :( कोई सुझाव? TIA।

+1

आप rtperson जवाब को स्वीकार करना चाहिए ... – yeyeyerman

उत्तर

8

प्रयास करें mylast [] = error "Empty list!" । बजाय अन्यथा हास्केल अपने कार्य के प्रकार के अनुमान लगा सकते हैं नहीं

6

एफ्रेम के समाधान काम करना चाहिए (ऊपर से मतदान) लेकिन मुझे लगता है कि यह एक छोटे से अधिक "हास्केल की तरह" है:।।

mylast [] = Nothing 
mylast (x:[]) = Just x 
mylast (x:xs) = mylast xs 

अस्वीकरण: मैंने वास्तव में यह कोशिश नहीं की है। मैंने वाक्यविन्यास त्रुटियां की हो सकती हैं।

+2

बीच मामले के रूप में एक ही है [ एक्स], है ना? IOW, खाली सूची के साथ x को संयोजित करके बनाई गई एक तत्व सूची "(x: [])" केवल x "[x]" वाली सूची के समान है। मुझे नहीं पता कि कौन सा बेवकूफ है, यद्यपि। –

+0

नहीं, बस एक्स [x] जैसा नहीं है। –

+0

ओह, रुको, मैं देखता हूं कि आपका क्या मतलब है। हां, मध्य मामला सूची है जिसमें केवल एक एक्स है। लेकिन सभी सूचियों को सिर और पूंछ के रूप में व्यक्त किया जा सकता है, भले ही एक या दोनों खाली हों। –

29

समस्या - जब आप हास्केल सीख रहे हैं तो कई अन्य लोगों की तरह - टाइपिंग में से एक है। 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 

लेकिन मेरे संदेह है कि हो सकता है कि जाने का रास्ता है।

+6

इससे एक सबक यह है कि आपके द्वारा परिभाषित सामग्री के प्रकार निर्दिष्ट करना उपयोगी होता है। यह संकलन कैच बग को इस तरह बना देगा .. – yairchu

+0

हर किसी के जवाब के लिए धन्यवाद। मैंने कोशिश की है ... mylast3 :: [एक] -> हो सकता है कि एक mylast3 [] = कुछ भी नहीं mylast3 (एक्स: []) = बस एक्स mylast3 (एक्स: XS) = mylast3 XS और मैं उदाहरण के लिए ... मुख्य> mylast3 [2,4,66,5,4,33] बस 33 :: शायद पूर्ण क्या यह 'बस' मुद्रित करने के लिए वैसे भी है? – user147056

+0

हर किसी के जवाब के लिए धन्यवाद। मैंने कोशिश की है ... mylast3 :: [एक] -> हो सकता है कि एक mylast3 [] = कुछ भी नहीं mylast3 (एक्स: []) = बस एक्स mylast3 (एक्स: XS) = mylast3 XS और मुझे उदाहरण मिलता है ... मुख्य> mylast3 [2,4,66,5,4,33] बस 33 :: शायद पूर्ण क्या इसे 'बस' मुद्रित करने के लिए वैसे भी है? – user147056

0

सभी के उत्तरों के लिए धन्यवाद। मैंने कोशिश की है ...

mylast :: [a] -> Maybe a 
mylast [] = Nothing 
mylast (x:[]) = Just x 
mylast (x:xs) = mylast xs 

और मैं जैसे मिलता है ...

Main> mylast3 [2,4,66,5,4,33] 
Just 33 :: Maybe Integer 

वहाँ बनाने यह जवाब में 'सिर्फ' मुद्रित नहीं की वैसे भी है?

[संपादित करें: जोर्ग डब्ल्यू मिट्टाग] (टिप्पणियां कोड पोस्ट करने के लिए भयानक हैं ...)

यहाँ कैसे पूरे कोड संदर्भ में दिखाई देता है:

mylast []  = Nothing 
mylast [x] = Just x 
mylast (x:xs) = mylast xs 

mylook (Just a) = do print a 
mylook Nothing = do error "Nothing to see here, move along!" 

mylook $ mylast [2,4,66,5,4,33] 
+2

हो सकता है कि हो सकता है कि मोनाड (और जावा में सी या नल संदर्भों में नल पॉइंटर्स) से कहें, यह है कि टाइप हस्ताक्षर स्पष्ट रूप से आपको दोनों मामलों से निपटने के लिए मजबूर करता है: कुछ वापस लौटाया गया था और कुछ भी वापस नहीं किया गया था । इसलिए, आपको दोनों मामलों पर स्पष्ट रूप से पैटर्न का मिलान करना होगा और उनके साथ अलग-अलग व्यवहार करना होगा। जैसे यदि आप परिणाम मुद्रित करना चाहते हैं: mylook (Just a) = एक प्रिंट करें! NEWLINE! दृष्टिकोण कुछ भी नहीं = त्रुटि करें "यहां देखने के लिए कुछ भी नहीं, साथ चलें!" !नई पंक्ति! mylook $ mylast [2,4,66,5,4,33] –

+0

'x <- mylast3 [2, 4, 66, 5, 4, 33]' – rampion

+0

"से केवल $ mylast [2,4,66, 5,4,33] "? (से केवल डेटा से आयात किया जाता है। Maybe) – newacct

0
myLast' [] = error "no empty lists allowed" 
myLast' [a] = a 
myLast' xs = xs !! (length xs - 1) 
+0

यह बताए कि यह क्या कर रहा है, अपने उत्तर में अधिक संदर्भ जोड़ें। – Adam

0
mylast [x] = x 
mylast (x:xs) = mylast xs 

पुनरावर्ती कॉल समाधान

संबंधित मुद्दे