所以我已经像这样非递归地弄清楚了:
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”子句中要输入什么内容...
任何帮助将不胜感激!
答案 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