【问题标题】:Converting a list of letters into a word (and removing speech marks)将字母列表转换为单词(并删除语音标记)
【发布时间】:2013-08-26 11:59:57
【问题描述】:

有没有人知道在 Haskell 中转换形式的方法

["w","o","r","d"]

进入

word

我刚刚完成了我的第一个程序(一个 RSA 加密),现在的输出真的很难看。如果这是一个非常愚蠢的问题,我很抱歉,但我真的不知道该怎么做。另外,为了让我的输入更容易,有谁知道转换的方法

word

进入

[w,o,r,d]

【问题讨论】:

    标签: list haskell output


    【解决方案1】:

    即使您从未听说过“concat”,也可以通过以下方法解决此类问题。让我们弄清楚你有什么类型:

    λ> :t ["w","o","r","d"]
    ["w","o","r","d"] :: [[Char]]
    

    好的,这是Chars 的列表。

    现在让我们找出你想要的类型:

    λ> :t "word"
    "word" :: [Char]
    

    所以我们需要一个函数,将Chars 的列表列表转换为Chars 的简单列表。换句话说,我们想要一个签名为[[Char]] -> [Char] 的函数。让我们使用Hoogle 搜索具有该类型签名* 的函数。刚才这样做,列表中的第四个函数是:

    concat :: [[a]] -> [a]
    base Prelude, base Data.List
    Concatenate a list of lists. 
    

    这正是我们想要的。

    • 更好的是,您可能已经意识到我们需要的操作可以对任何类型的列表进行操作。然后您将搜索类型签名[[a]] -> [a]。 (这种洞察力伴随着实践。)当我刚刚这样做时,concat 是第一个结果。

    【讨论】:

    • 因为我的声誉不够高,所以我无法对您的回复投赞成票,但非常感谢您,我现在就去申请。
    • 这可能是一个非常愚蠢的问题,但是我现在如何应用您给我的操作?
    • 只是您提到 Hoogle 的事实使这个回复比其他回复好很多。当您使用 Haskell 时,Hoogle 是一个非常宝贵的工具!
    【解决方案2】:

    检查类型:

    Prelude> let s = ["w","o","r","d"]
    Prelude> :t s
    s :: [[Char]]
    

    因此您可以将其视为字符列表。

    什么函数“展平”列表?连接:

    Prelude> :t concat s
    concat s :: [Char]
    

    这就是我们的字符串,我们用 putStrLn 打印它

    Prelude> putStrLn  $ concat s
    word
    

    【讨论】:

      【解决方案3】:

      正如其他人所说,concat 是将[[Char]] 转换为[Char] 的方式,至于其他方式,您有两种选择。您可以将您的字符串"word" 视为Chars 的列表(请记住,它的类型是String,这只是[Char] 的别名)并且只需在Chars 上操作而不是@987654329 @s,或者您可以将每个单个字符转换为单个字符String。我推荐前者,但我也会演示另一个。

      最简单的方法是使用非常简单的列表推导。您所要做的就是从单词中获取每个字母,并将其包装在[] 中以使其成为一个列表。由于String = [Char],您将单词的每个字母作为String

      splitUpWord :: String -> [String]
      splitUpWord word = [[letter] | letter <- word]
      

      【讨论】:

      • 谢谢,我的声誉还不够高,无法投票赞成您的答案,但在我对问题的第一部分进行排序后,我会尝试一下:)
      • 另一种(更惯用的)方法是splitUpWord = map (:[])
      • @kqr 这是我的第一个解决方案,但为了用户 2710971 的缘故,我要清楚。
      【解决方案4】:

      看看concat。您有一个字符列表列表。展平这是一种常见的模式,而 concat 是执行此操作的工具。也就是说,如果您正在学习,您可能会自己尝试一下。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-10-06
        • 1970-01-01
        • 2019-01-18
        • 2015-11-24
        • 2019-11-21
        • 1970-01-01
        • 2014-07-16
        • 2010-11-16
        相关资源
        最近更新 更多