【问题标题】:List of Strings to single String字符串列表到单个字符串
【发布时间】:2016-04-20 13:07:44
【问题描述】:

我正在尝试在一本书中做这个练习,

定义一个函数:

onSeperateLines :: [String] -> String

它接受一个字符串列表并返回一个字符串,打印时将字符串显示在单独的行上。

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

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

我可以编写接受字符串并将其转换为列表的函数,也可以编写输出列表的列表,但我不知道如何获取列表并将其转换为单个字符串。

【问题讨论】:

    标签: haskell


    【解决方案1】:

    String 只不过是一个字符列表:

    type String = [Char]
    

    因此,

    onSeperateLines :: [[Char]] -> [Char]
    

    现在,如果您在某些应用程序中确实需要它,最好先发送ask Hoogle if there's already something there。你会得到很多结果:

    unlines :: [String] -&gt; String -- 正是您要实现的功能!
    unwords :: [String] -&gt; String -- 类似,但只插入空格,而不是换行符
    joinPath :: [FilePath] -&gt; FilePath - - 此处不相关
    concat :: [[a]] -&gt; [a] -- 这完成了将嵌套列表展平为字符串等简单列表的一般任务。

    concat 是一个不错的选择,如果您不仅想为特定任务使用标准功能,而且不想让生活变得不必要的困难。

    当然,自己编写一次完全这样的函数也无妨。为此,您需要递归地解构列表。由于模式匹配,这非常简单:

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

    想一想这些差距中发生了什么。


    foldr 的等效解决方案也是一个很好的练习。

    【讨论】:

    • 我以前没有使用过 (l:ls) 表示法,如果我输入了 ["first","second","third"] 的列表,我将如何使用 'l' 来获取最后两个字符串,因为 'ls' 是一个列表,而 'l' 指的是列表中的第一个字符串,不是吗?
    • 另一个不错的:intercalate,很容易概括unwordsunlines
    • @W22:对。这就是你对ls 进行递归调用的原因:在其中一个调用中,任何一行都将是l 一次!
    猜你喜欢
    • 1970-01-01
    • 2015-09-11
    • 1970-01-01
    • 2014-03-30
    • 2014-04-19
    • 2013-10-21
    • 1970-01-01
    • 2013-01-21
    相关资源
    最近更新 更多