我在使用此功能时遇到了很多麻烦:
concatenate :: [String] -> String
它被设计为简单地获取字符串列表并返回单个字符串,该字符串是列表中每个元素从头到尾连接的结果。我试图保持map
,foldl
和foldr
功能。我觉得我知道这些功能的概念做得很好,但我遇到的最常见的问题是我遇到类型冲突。例如,GHC会期待一个[Char],并且在我不知情的情况下,我会放入显然试图使用[[Char]]的代码。
例如:concatenate (x:xs) = foldr (++) x (concatenate xs)
我得到以下编译错误:
Couldn't match type `Char' with `[Char]'
Expected type: [[Char]]
Actual type: String
In the return type of a call of `concatenate'
In the third argument of `foldr', namely `(concatenate xs)'
In the expression: foldr (++) x (concatenate xs)
我
答案 0 :(得分:11)
你实际上并不需要那里的递归电话。函数foldr
已经模拟了递归调用。您需要做的就是使用:
concatenate :: [String] -> String
concatenate ls = foldr (++) "" ls
请记住,已经有concat
function,这更通用,因为它适用于任何列表列表(而不是简单的字符串列表)。