2011-07-14 16 views
8

मैं हास्केल में नौसिखिया हूँ, और मैं सवाल है: मैं लिखना कोड:Haskell और स्ट्रिंग लंबाई

word_list = ["list", "lol", "wordword"] 
check str = if head str == 'l' then tail str else str 
average wl = (length $ concat $ map check wl) `div` length wl 

इस कोड शब्द सूची में हर शब्द के पहले "l" प्रतीक को हटाना होगा, concat प्राप्त शब्द , शब्द गणना पर परिणाम स्ट्रिंग और div की लंबाई प्राप्त करें।

इसलिए इस कोड में मैं प्राप्त करना होगा: 13/3 = 4.333 ... ("listlolwordword" = 15, "istolwordword" = 13) लेकिन मैं प्राप्त केवल 4.

average :: [[Char]] -> Float काम नहीं करते , मुझे त्रुटि मिलती है। मेरी गलती कहाँ है? पीएस। खेद मेरी अंग्रेजी, कृपया

उत्तर

12

length समारोह एक Int देता है, और div समारोह पूर्णांक विभाजन करता है, दूसरे शब्दों में, यह आंशिक हिस्सा चला जाता है।

word_list = ["list", "lol", "wordword"] 
check str = if head str == 'l' then tail str else str 
average wl = fromIntegral (length $ concat $ map check wl)/fromIntegral (length wl) 

मैं इसे पर हूँ, तब तक आप के बजाय check में मिलान पद्धति का उपयोग कर विचार करना चाहिए: आप एक Float परिणाम चाहते हैं, तो आपको पहले एक Float को length का परिणाम कन्वर्ट करने के लिए है, तो बजाय विभाजन के लिए (/) का उपयोग की जरूरत है , जैसे:

check ('l':str) = str 
check str = str 

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

+0

वाह। बहुत बहुत धन्यवाद! पैटर्न मिलान के बारे में : यह अद्भुत है! मुझे हर दिन हैस्कल पसंद है :) –

+1

@user: ध्यान दें कि concatMap भी है, इसलिए आपको 'संक्षिप्त $ map' नहीं करना है। –

+1

और मुझे लगता है कि एक और स्पष्ट दृष्टिकोण संभवतः 'योग $ मानचित्र (लंबाई। चेक) wl' है (हालांकि संलयन संभवतः इस महत्वहीन को प्रस्तुत करता है) – alternative

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