Haskell 和字符串长度

标签 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”符号,连接收到的单词,获取结果字符串的长度和单词计数的 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/

相关文章:

haskell - 组合列表和单个项目时出现防护条件错误

PostgreSQL Simple 在一个元组中最多只支持 10 个变量,但我需要更多

haskell 错误: Couldn't match type 'a' with 'b'

haskell - 无法将类型 ‘[Char]’ 与 ‘Data.Text.Internal.Text’ 匹配

haskell - Haskell中do block 中 `<-`的含义

haskell - 为什么 hSetBuffering 不返回新句柄而不是更改给定句柄?

haskell - 如何使 Maybe 的这个替代定义起作用?

haskell - 如何在绑定(bind)操作中使用非一元函数

list - 证明流的平等

Haskell:过滤器应用于太多参数