在Haskell中获取列表中的单词长度

时间:2016-12-07 00:48:12

标签: haskell

我开始写几个函数,我可以在一个句子中计算特定的单词等等,但现在我需要计算列表中单词的长度。所以我有一个列表,其中每个元素都是一个单词,并想要计算这个单词的字符。 我无法找到任何解决办法,因为Haskell没有使用循环。反正有吗?

1 个答案:

答案 0 :(得分:2)

如果您认为在Haskell中工作时需要循环,那么您可能正在寻找递归。我们想要通过字符串列表递归,将length函数应用于每个字符串。通过列表递归的一般模式,其中函数应用于每个值(当您通过Haskell工作时,您将非常熟悉)看起来大致如下:

func f []     = []
func f (x:xs) = f x : func f xs

所以我们可以通过这种方式解决问题(专门处理函数,而不是将其作为参数接受):

wordLengths :: [String] -> [Int]
wordLengths []     = []
wordLengths (x:xs) = length x : wordLengths xs

但是,由于这种行为如此常见,因此存在一个函数map来为我们处理所有这些。它的类型签名是(a -> b) -> [a] -> [b],所以我们知道它传递一个函数(length)和一个事物列表(我们的String s)。如果我们map length函数列出了字符串列表中的每个值,我们就会得到您想要的结果:

wordLengths :: [String] -> [Int]
wordLengths = map length

使用示例:

ghci>> wordLengths ["abc","defg"]
[3,4]