我是 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”符号,连接收到的单词,获取结果字符串的长度和单词计数的 div。
所以在这段代码中我必须收到: 13/3 = 4,333...(“liSTLolwordword”= 15,“istolwordword”= 13) 但我只收到 4 个。
average::[[Char]] -> Float
不起作用,我收到错误。我的错误在哪里?
附:对不起,我的英语,请
最佳答案
length
函数返回一个Int
,而div
函数执行整数除法,换句话说,它去掉小数部分。如果想要Float
结果,需要先将length
的结果转换为Float
,然后使用(/)
代替除法:
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
这种样式更具可读性,而且不太可能出现错误 - 例如,如果给定空字符串,您的版本将会失败。
关于Haskell 和字符串长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6700570/