2016-11-16 3 views
5

पहला सवाल अंदर लंबाई से उत्पन्न होने वाले के लिए कोई उदाहरण है, इसलिए कृपया तरह मेरे साथ :)Foldable यहाँ और पूरी तरह से Haskell पर एक noob लैम्ब्डा

मैं this हास्केल के प्रश्न संख्या 6 के साथ खेल रहा था अभ्यास

और अंत में समाधान (या कुछ इसी तरह मुझे उम्मीद है कि) इस कोड को

combinations gr lis = filter clean $ sequence $ replicate gr lis 
where 
    clean string 
     | total > gr = False 
     | otherwise = True 
     where total = sum [ rpt c string | c <- string] 
    rpt chr list = length $ filter (== chr) list 

बात यह है कि मैं प्रकाश डाला जाना करने के लिए समारोह 'rpt' जो एक चरित्र में दोहराया है समय की संख्या में गिना जाता है है की तरह साथ के लिए आया था परीक्षा के लिए एक स्ट्रिंग ई: "Aaba" -> [3313] (3 पत्र एक है, जो 3 बार repeates से आता है) "aaccva" -> [332,213]

पर बाद में मैं एक लैम्ब्डा के साथ समारोह करने की कोशिश की और एक नक्शा इस में जिसके परिणामस्वरूप:

rpt chr list = map (\chr -> length $ filter (== chr)) list 

और पहली GHCi पर मुझे बताया FlexibleContext उपयोग करने के लिए इस अनुमति देने के लिए, लेकिन अगर मैं तो यह पैदावार:

<interactive>:7:1: 
No instance for (Foldable ((->) [Char])) 
    arising from a use of ‘rpt’ 
In the expression: rpt 'a' string 
In an equation for ‘it’: it = rpt 'a' string 

और यहाँ I'am अटक, मेरे पास है यह समझने में सक्षम नहीं है कि क्या हो रहा है ... इस फ़ंक्शन को ठीक करने के लिए क्या आवश्यक है?

rpt chr list = map (\chr -> length $ filter (== chr) list) list 

अभी शुरुआत के रूप में, मैं FlexibleContexts की GHCi के सुझाव की अनदेखी होगा:

+1

यह शुरुआती व्यक्ति के लिए बहुत अच्छा संरचनात्मक रूप से है जो आप कहते हैं, आपके पास इस – luqui

+0

के लिए एक नाटक है, जब आप एक भ्रमित त्रुटि संदेश प्राप्त करते हैं, तो टाइप एनोटेशन जोड़ना शुरू करें जो आपको लगता है कि प्रकार क्या होना चाहिए । यह * महत्वपूर्ण * त्रुटि संदेशों में सुधार होगा। वास्तव में, जितनी जल्दी हो सके गलतियों को पकड़ने के लिए सभी शीर्ष-स्तरीय कार्यों के लिए टाइप एनोटेशन प्रदान करना आम तौर पर अच्छा अभ्यास है। –

+0

यह एक शुरुआत के लिए अच्छा है। कुछ नोट्स: 1) 'क्लीन स्ट्रिंग = कुल <= gr जहां ...' पर विचार करें, क्योंकि गार्ड का उपयोग करने के बाद या फिर-सही और झूठी दिखने के लिए और अधिक जटिल होने की आवश्यकता है 2) संयोजन के लिए आपका एल्गोरिदम दिखता है सही लेकिन उप-शीर्ष: आप कई उम्मीदवार उत्पन्न करते हैं, और आपको बाद में उन्हें फ़िल्टर करने की आवश्यकता होती है। इस पर विचार करें: आप 'x' x को छोड़कर 'x: xs' से के तत्वों को चुन सकते हैं (और सभी के तत्वों को 'xs' से ले जा रहे हैं) या' x' चुनना (और फिर 'xs' से केवल के -1 तत्वों को लेना) । – chi

उत्तर

5

आप संभावना है, आप भी filter का एक तर्क के रूप list जोड़ने की जरूरत है list से अधिक फिल्टर करने के लिए है, तो ऊ अपने कोड काम करने के इच्छुक रहे हैं । आपके पास जितनी पसंद थी (या अन्य भ्रमित चीजें जैसे No instance for (Num (Int -> Bool))) के त्रुटि संदेशों को उत्पन्न करने के लिए यह अक्सर अधिक नहीं होता है।

+0

प्रस्ताव: वह वास्तव में जो फिक्स चाहता था वह मैप किए गए फ़ंक्शन के अंत में 'सूची' शामिल करना था (जैसा कि 'मानचित्र (\ chr -> लंबाई $ फ़िल्टर (== chr) सूची) सूची में)। आपका कोड फ़ंक्शंस की एक सूची तैयार करता है; मेरा नंबरों की एक सूची पैदा करता है। –

+0

@DanielWagner मुझे लगता है कि आप सही हैं। मैं तदनुसार समाधान में संशोधन करूंगा। – Alec

+0

वाह इतना आसान समाधान ... धन्यवाद @ एलेक आपने मेरी बहुत मदद की है! – iPizarro12

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