我正在尝试编写一个函数,该函数从第二个字符串中删除第一个字符串中的所有字符。我需要使用递归和另一个删除的辅助函数,以删除所有出现的 字符串中的字符。我无法添加递归部分。
rmCharsRec是我要编写的函数,而rmChar是另一个函数。
rmCharsRec :: String -> String -> String
rmCharsRec [] ys = ys
rmCharsRec (x:xs) [] = []
rmCharsRec (x:xs) ys = rmChar x ys
rmChar :: Char -> String -> String
rmChar c xs = filter ( /= c) xs
rmCharsRec ['a'..'l'] "football"
我期望输出“ oot”,但是却出现“ footbll”。
答案 0 :(得分:4)
您说您需要使用递归,但是您在任何地方都没有调用它的函数。特别是,当您拥有x:xs
时,您是否不应该在某个时候关心xs
?
答案 1 :(得分:2)
问题在于,在第三个子句中,您仅从字符串中删除了字符x
。确实:
rmCharsRec :: String -> String -> String
rmCharsRec [] ys = ys
rmCharsRec (x:xs) [] = []
rmCharsRec (x:xs) ys = rmChar x ys
删除该字符后,您仍然需要删除列表xs
其余部分中的其他字符。
因此,您应在此处递归,例如:
rmCharsRec :: String -> String -> String
rmCharsRec [] ys = ys
rmCharsRec (x:xs) [] = []
rmCharsRec (x:xs) ys = rmCharsRec … (rmChar x ys)
使用…
仍需要填写的部分。