2015-02-18 4 views
6

मैं काम करने के लिए इस समारोह हो रही परेशानी का एक बहुत हो रही है:जोड़ने के फ़ंक्शन बनाएं हास्केल में: [स्ट्रिंग] -> स्ट्रिंग

concatenate :: [String] -> String 

यह बस स्ट्रिंग की एक सूची लेने के लिए और एक भी वापस जाने के लिए डिज़ाइन किया गया है स्ट्रिंग जो सूची के प्रत्येक तत्व के सिर से पूंछ के संयोजन के परिणाम है। मैं map, foldl, और foldr फ़ंक्शंस में रहने की कोशिश कर रहा हूं। मुझे लगता है कि मुझे पता है कि इन कार्यों की अवधारणा कितनी अच्छी तरह से करती है, लेकिन सबसे आम समस्या जो मैं चल रहा हूं वह यह है कि मुझे प्रकार का संघर्ष हो रहा है। जीएचसी उदाहरण के लिए [चार] की अपेक्षा करेगा, और मैं कोड में डाल दूंगा जो स्पष्ट रूप से मुझे [[चार]] का उपयोग करने के बिना इसका उपयोग करने की कोशिश कर रहा है।

उदाहरण के लिए: concatenate (x:xs) = foldr (++) x (concatenate xs)

और मैं निम्नलिखित संकलन त्रुटि मिलती है:

Couldn't match type `Char' with `[Char]' 
Expected type: [[Char]] 
    Actual type: String 
In the return type of a call of `concatenate' 
In the third argument of `foldr', namely `(concatenate xs)' 
In the expression: foldr (++) x (concatenate xs) 

मैं बहुत हास्केल के लिए नई हूँ, इसलिए हंसना संकोच न करें। कठोरता की उम्मीद है, और स्वागत है, जब तक एक नौसिखिया के लिए एक स्पष्टीकरण फिट भी शामिल है। किसी भी और सभी मदद के लिए धन्यवाद।

उत्तर

9

आपको वास्तव में रिकर्सिव कॉल की आवश्यकता नहीं है। फ़ंक्शन foldr पहले से ही रिकर्सिव कॉल को अनुकरण करता है। याद वहाँ के रूप में यह सूची के किसी भी सूची पर काम करता है एक concat function पहले से ही जो अधिक सामान्य है कि,, (बस तार की सूची के लिए विरोध के रूप में)

concatenate :: [String] -> String 
concatenate ls = foldr (++) "" ls 

और: तुम सब करने की ज़रूरत इस्तेमाल होता है।

+2

और यह इतना आसान था ... धन्यवाद। सी से आने के बाद हास्केल में कार्यों को विकसित करने के लिए आवश्यक मानसिकता में जाना मेरे लिए बहुत मुश्किल है और लगभग 'संक्षिप्त' के बारे में, मुझे पता है कि यह अस्तित्व में है, लेकिन मैं अपने मूल संस्करण बनाकर इन बुनियादी कार्यों को समझने की कोशिश कर रहा हूं। यह अतीत में अन्य भाषाओं में मदद करना प्रतीत होता है। – UnworthyToast

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