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