在Haskell中的字符串中的任意位置将双精度空格转换为单空格

我一直在尝试完成一个转换功能 将String中的双倍空格转换为Haskell中的单个空格。

normaliseSpace:: String -> String
normaliseSpace (x:y:xs)= if x==' ' && y==' ' then y:xs
else xs

我的代码存在的问题是只能在字符串的开头转换双精度空格。我想它与模式匹配有关,但是由于我对Haskell完全陌生,所以我真的不知道该怎么做。任何帮助将不胜感激!

zhang0013hao 回答:在Haskell中的字符串中的任意位置将双精度空格转换为单空格

发生这种情况的原因是因为y:xsxs在字符串的其余部分不会递归。因此,您希望对字符串的其余部分执行该功能。

因此,您应该在normaliseSpace上叫xs作为尾巴。例如:

normaliseSpace:: String -> String
normaliseSpace "" = ""
normaliseSpace (' ' : ' ' : xs) = ' ' : normaliseSpace xs
normalissSpace (x:xs) = x : normaliseSpace xs

请注意,您还需要为空字符串(列表)添加一个模式。因为否则最终递归将到达列表的末尾,并因此引发错误,因为没有子句可以“触发”。

如果您想减少一系列空格(两个或更多更多到一个),那么我们甚至需要将' ' : xs通过normalizeSpace,例如{{3 }}:

normaliseSpace:: String -> String
normaliseSpace "" = ""
normaliseSpace (' ' : ' ' : xs) = normaliseSpace (' ':xs)
normalissSpace (x:xs) = x : normaliseSpace xs

我们可以在此处使用{@ {3}}之类的样式:

normaliseSpace:: String -> String
normaliseSpace "" = ""
normaliseSpace (' ' : xs@(' ' : _)) = normaliseSpace xs
normalissSpace (x:xs) = x : normaliseSpace xs
,

也许您可以简单地喜欢

*Main> let normSpaces = unwords . words
*Main> normSpaces "hello     world"
"hello world"
本文链接:https://www.f2er.com/3160156.html

大家都在问