2011-07-14 214 views
8

我在Haskell的新手,我有一個問題: 我寫的代碼: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不工作,我收到錯誤。我的錯誤在哪裏? ps。對不起我的英語水平,請

回答

12

length函數返回一個Intdiv函數執行整數除法,換句話說,它丟棄小數部分。如果你想要一個Float因此,你需要先轉換結果的lengthFloat,然後用(/)爲師,而不是:

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匹配,而不是如:

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

這種風格既更具可讀性和不太可能有錯誤 - 例如,如果給一個空字符串您的版本將失敗。

+0

哇。非常感謝你!關於模式匹配: :太神奇了!我喜歡hasskel每天更多:) –

+1

@user:請注意,還有concatMap,所以你不必做'concat $ map'。 –

+1

,我會注意到一個更清晰的方法可能是'sum $ map(length。check)wl'(儘管融合可能使這個不重要) – alternative