单个字符串的字符串列表

时间:2016-04-19 21:15:12

标签: haskell

我正试着在书中做这个练习,

定义一个函数:

onSeperateLines :: [String] -> String

获取字符串列表并返回单个字符串,打印时在不同的行上显示字符串。

我正在努力将列表转换为单个字符串

onSeperateLines :: [String] -> String
onSeperateLines ls = [x | x <- ls]

我可以编写带字符串并将其转换为列表的函数以及输出列表的列表,但我无法弄清楚如何获取列表并将其转换为单个字符串。

1 个答案:

答案 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的等效解决方案也是一个很好的练习。