Haskell:修剪String并消除多个空格

时间:2013-10-31 16:20:15

标签: haskell haskell-platform

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

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

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

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

现在我的想法是在输入String上进行模式匹配。但是如何将trim函数直接应用于输入?所以一开始我想修剪两端的String,然后应用模式匹配。因此,我唯一需要做的就是比较两个字符,如果两个字符都是空白字符,则删除一个字符

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

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

干杯

4 个答案:

答案 0 :(得分:7)

trim = unwords . words

检查Prelude中words的来源。

答案 1 :(得分:2)

如果你想在trim的输出上进行模式匹配,你当然需要调用trim!例如,如果您需要长度为0,1和更长的列表的案例,则可以使用

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

答案 2 :(得分:2)

您的第一个模式匹配单个字符并返回它。当然这不是你想要的 - 它可能是空白。你的第一场比赛应该是空名单。

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

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 = ...

同样,这已经展示了如何匹配字符串的开头部分。让你考虑到最后。

答案 3 :(得分:0)

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

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

此处removeInnerSpaces是嵌套函数,位于s的本地。