我将如何用“%20”递归替换字符串中的空格?

时间:2018-11-09 07:35:35

标签: haskell

所以我已经像这样非递归地弄清楚了:

noSpaces :: [Char] -> [Char]    
noSpaces xs = [f | r <- xs, f <- if (r == ' ') then "%20" else [r]]

但是现在我需要找出如何递归地做到这一点,没有模式匹配也没有串联...

我足够容易地发现了其他递归函数(gcd,fib以及其他一些涉及数字的函数)……但是由于某种原因而迷失了它,并且迷失了我尝试的更多不起作用的东西。 ..

我在Haskell上找到了关于执行此操作的另一个答案...但是这个想法使用了两个独立的函数,一个像一个助手函数-您将如何尽可能简洁地在一个函数中进行所有操作?

类似:

replace [Char] = [Char]
replace (x:xs)
    | x == ' ' = "%20":replace xs

虽然可以编译,但我当然会收到“函数中的非穷举模式”错误消息,并且无法弄清楚在“ otherwise”子句中要输入什么内容...

任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:3)

您错过了不是' '的情况。 因此,请尝试以下操作:

replace [] = []
replace (x:xs) 
    | x == ' ' = "%20" ++ replace xs
    | otherwise = x : replace xs

您需要在第一警卫中使用++,因为 string 是一个字符列表。

答案 1 :(得分:2)

尝试一下

replace []     = []
replace (x:xs) = (if x == ' ' then "%20" else [x]) ++ replace xs