我正试着在书中做这个练习,
定义一个函数:
onSeperateLines :: [String] -> String
获取字符串列表并返回单个字符串,打印时在不同的行上显示字符串。
我正在努力将列表转换为单个字符串
onSeperateLines :: [String] -> String
onSeperateLines ls = [x | x <- ls]
我可以编写带字符串并将其转换为列表的函数以及输出列表的列表,但我无法弄清楚如何获取列表并将其转换为单个字符串。
答案 0 :(得分:3)
String
只是一个字符列表:
type String = [Char]
因此,
onSeperateLines :: [[Char]] -> [Char]
现在,如果你真的需要这个用于某些应用程序,那么首先ask Hoogle if there's already something there是个好主意。你得到了很多结果:
unlines :: [String] -> String
- 完全您正在尝试实施的功能!
unwords :: [String] -> String
- 类似但仅插入空格,而不是换行符
joinPath :: [FilePath] -> FilePath
- 此处不相关
concat :: [[a]] -> [a]
- 这样做的一般任务是将嵌套列表展平为一个简单的列表,如字符串。
concat
是一个不错的选择,如果您不想为特定任务使用标准功能,但也不想让生活变得比必要更困难。
当然,一旦完全自己编写类似这样的函数也会造成伤害。为此,您需要递归† 解构列表。由于模式匹配,这非常简单:
onSeperateLines [] = ... --- no lines to concatenate... what's the result?
onSeperateLines (l:ls) = ...
where otherLines = onSeperateLines ls
稍微考虑一下这些差距。
† foldr
的等效解决方案也是一个很好的练习。