1

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

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

我已经编写了一个修剪字符串并删除空白字符的函数(如果 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 的工作原理。

干杯

4

4 回答 4

9

trim = unwords . words

检查words前奏中的来源。

于 2013-10-31T16:55:51.567 回答
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 = ...

同样,这显示了如何匹配字符串的开头部分。让您自己考虑如何走到最后。

于 2013-10-31T16:44:13.703 回答
2

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

s xs = case trim xs of
    [] -> ...
    [x] -> ...
    x:x':xs -> ...
于 2013-10-31T16:37:54.333 回答
0

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

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

removeInnerSpaces是一个嵌套函数,本地到s.

于 2013-10-31T16:49:54.047 回答