2016-04-19 32 views
-1

我试图做这个练习的一本书,列表字符串的单串

定义一个函数:

onSeperateLines :: [String] -> String 

这需要字符串列表,并返回其打印时一个字符串在单独的行上显示字符串。

我有一个列表转换为一个字符串挣扎

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

我可以写一个字符串并将其转换为一个列表,并输出一个列表的列表功能,但我可以”弄清楚如何获取列表并将其转换为单个字符串。

回答

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如果您不只是想为特定任务使用标准功能,而且也不想让生活变得比必要更难,那么这是一个不错的选择。

当然,也可以自己编写一个这样的函数,一次完成完全。要做到这一点,你需要递归&dagger;解构列表。这非常简单,这要归功于模式匹配:

onSeperateLines [] = ... --- no lines to concatenate... what's the result? 
onSeperateLines (l:ls) = ... 
where otherLines = onSeperateLines ls 

想一想这些差距会发生什么。


&dagger;foldr同等的解决方案也是一个很好的练习。

+0

如果我输入[“first”,“second”,“third”]的列表,我还没有使用(l:ls)符号,我将如何使用'l'来获取最后两个字符串因为'ls'是一个列表,'l'是指列表中的第一个字符串,不是吗? – W22

+1

另一个很好的:'插入式',它可以很容易地推广'unwords'和'unlines'。 – dfeuer

+0

@ W22:对。这就是为什么你对'ls'进行递归调用的原因:在其中一个调用中,任何行都将是'l'! – leftaroundabout

相关问题