我刚刚开始使用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的工作原理。
干杯
答案 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
的本地。