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

将Haskell中字符串中任意位置的双空格转换为单空格,haskell,Haskell,我一直在尝试完成一个转换 将字符串中的双空格转换为Haskell中的单个空格 normaliseSpace:: String -> String normaliseSpace (x:y:xs)= if x==' ' && y==' ' then y:xs else xs 我的代码的问题是只转换字符串开头的双空格。我想这与模式匹配有关,但由于我对Haskell完全陌生,我真的不知道如何做。任何帮助都将不胜感激 发生这种情况的原因是y:xs和xs不会在字符串的其余部分递归。因

我一直在尝试完成一个转换 将字符串中的双空格转换为Haskell中的单个空格

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

我的代码的问题是只转换字符串开头的双空格。我想这与模式匹配有关,但由于我对Haskell完全陌生,我真的不知道如何做。任何帮助都将不胜感激

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

因此,您应该调用
xs
上的
normaliseSpace
作为tail。例如:

normaliseSpace:: String -> String
normaliseSpace "" = ""
normaliseSpace (' ' : ' ' : xs) = ' ' : normaliseSpace xs
normalissSpace (x:xs) = x : normaliseSpace xs
我们可以在这里使用as模式,如:

normaliseSpace::String->String
normaliseSpace“”=“”
normaliseSpace(“”:xs@(“”:))=normaliseSpace xs

normalisspace(x:xs)=x:normaliseSpace xs
发生这种情况的原因是
y:xs
xs
不会在字符串的其余部分递归。因此,您希望对字符串的其余部分执行该函数

因此,您应该调用
xs
上的
normaliseSpace
作为tail。例如:

normaliseSpace:: String -> String
normaliseSpace "" = ""
normaliseSpace (' ' : ' ' : xs) = ' ' : normaliseSpace xs
normalissSpace (x:xs) = x : normaliseSpace xs
我们可以在这里使用as模式,如:

normaliseSpace::String->String
normaliseSpace“”=“”
normaliseSpace(“”:xs@(“”:))=normaliseSpace xs

normalisspace(x:xs)=x:normalisspace xs
可能是您可以简单地执行以下操作

*Main> let normSpaces = unwords . words
*Main> normSpaces "hello     world"
"hello world"

也许你可以简单地做喜欢的事

*Main> let normSpaces = unwords . words
*Main> normSpaces "hello     world"
"hello world"

尝试对另一种情况使用递归。三重空间应该做什么?您可能会考虑<代码>标准化空间= unWord。words如果您可以将任意长的空格序列(但请注意:包括换行符)折叠到一个空格中。在另一种情况下,请尝试使用递归。三重空格应该怎么做?您可能会考虑<代码>标准化空间= unWord。words如果你可以将任意长的空格序列(但要注意:包括换行符)折叠到一个空格中。实际上,递归
normaliseSpace$'':xs
可能会更好,因此多个空格也会减少到一个。(但从OP上看这并不清楚)这很有效。非常感谢你!我以前尝试过使用递归,但我错过了最有可能的基本情况。为什么要重建
'':xs
而不是使用at模式?实际上,递归
normaliseSpace$'':xs
可能会更好,因此多个空间也会减少为一个。(但从OP上看这并不清楚)这很有效。非常感谢你!我以前尝试过使用递归,但我错过了最有可能的基本情况之一。为什么要重建
':xs
而不是使用at模式?