2011-07-14 154 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