【发布时间】:2021-12-31 23:10:21
【问题描述】:
我需要使用foldr 处理字符串,其中'#' 表示删除前一个字符。例如:
>backspace "abc#d##c"
"ac"
>backspace "#####"
""
需要使用foldr 遍历列表,而不使用reverse 和/或(++)。
这是我到目前为止所得到的:
backspace :: String -> String
backspace xs = foldr func [] xs where
func c cs | c /= '#' = c:cs
| otherwise = cs
但它只是从字符串中过滤'#'。我想每次c == '#' 都删除当前答案的最后一个元素并得到类似的东西
backspace :: String -> String
backspace xs = foldr func [] xs where
func c cs | c /= '#' = c:cs
| cs /= [] = init cs
| otherwise = cs
但它不能正常工作,
ghci> backspace "abc#d##c"
"abc"
【问题讨论】:
-
您可能不需要
reverse,因为foldr从右侧反向操作。您是否被告知foldr应该直接返回实际字符串?或者foldr可能会返回一些最终的state,您可以从中轻松提取实际字符串?