【问题标题】:Haskell: trim String and eliminate multiple spacesHaskell:修剪字符串并消除多个空格
【发布时间】:2013-10-31 16:20:15
【问题描述】:

我刚刚开始使用 Haskell 进行编程,并且想做一个字符串转换。 我有一个任意字符串,例如 " abcd \n 爸爸 " 我想删除左侧和右侧的空白字符。我想消除多个空格以及转义序列“\n”->“”

所以上面的字符串看起来像这样 "abcd 爸爸"

我已经编写了一个修剪字符串并删除空白字符的函数(如果 isSpace 为真,我将删除该字符):

trim :: [Char] -> [Char]
trim x = dropWhileEnd isSpace (dropWhile isSpace x)

现在我的想法是对输入字符串进行模式匹配。但是如何将修剪功能直接应用于输入?所以起初我想修剪两端的字符串,然后应用模式匹配。所以我唯一要做的就是比较两个字符,如果两个都是空白字符,则删除一个

    --How do I apply trim directly to the input
    s :: [Char] -> [Char]
    s [x] = [x]
    s(x:xx) = ...

注意:效率并不重要。我想学习模式匹配的概念并了解 Haskell 的工作原理。

干杯

【问题讨论】:

    标签: haskell haskell-platform


    【解决方案1】:

    trim = unwords . words

    检查前奏中words 的来源。

    【讨论】:

    • OP 正在尝试学习如何在 Haskell 中编写模式匹配/递归函数,而不是如何使用已经存在的函数。
    • 我意识到这一点并坚持这种方法,即理解如何简单地(适当地)做到这一点,然后分析源代码中的底层细节,事实上,这些细节在这种情况下是相关的。
    • 帮助我,只是在寻找答案。谢谢。
    【解决方案2】:

    如果你想对trim 的输出进行模式匹配,你当然必须调用trim!例如,如果您想要长度为 0、1 或更长的列表的案例,您可以使用

    s xs = case trim xs of
        [] -> ...
        [x] -> ...
        x:x':xs -> ...
    

    【讨论】:

      【解决方案3】:

      您的第一个模式匹配单个字符并返回它。这肯定不是你想要的——它可能是空格。您的第一个匹配项应该是空列表。

      如果你只是删除空格字符,你可以这样做:

      trim :: [Char] -> [Char]
      trim [] = []
      trim (' ':xs) = trim xs
      ...
      

      您应该能够看到这会删除所有前导空格。此时,字符串要么是空的(并且匹配第一个模式),要么它落入...由您决定。

      如果要删除所有空格,则需要这些字符的列表或集合。可能看起来像这样:

      trim :: [Char] -> [Char]
      trim = let whitespace = [' ', '\t\, `\v'] -- There are more than this, of course
             in t
             where
               t [] = []
               t (x:xs) | elem x whitespace = t xs
                        | otherwise = ...
      

      再次说明了如何匹配字符串的开头部分。让您自己考虑是否到达终点。

      【讨论】:

        【解决方案4】:

        您还可以在嵌套函数中进行模式匹配:

        s str = removeInnerSpaces (trim str)
          where
            removeInnerSpaces [] = []
            removeInnerSpaces (x:xs) = ...
        

        这里的removeInnerSpaces 是一个嵌套函数,是s 的局部函数。

        【讨论】:

          猜你喜欢
          • 2011-11-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-05-08
          • 1970-01-01
          • 2010-10-19
          • 2022-09-27
          相关资源
          最近更新 更多