我需要使用foldrwhere'#'表示洗掉前一個字符來處理字串。例如:
>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"
uj5u.com熱心網友回復:
您可以使用(Int, String)as 狀態,foldr其中第一個Int是退格String符的數量,而 the是當前構造的字串。
因此,這意味著您可以使用:
backspace :: String -> String
backspace = snd . foldr func (0, [])
where func '#' (n, cs) = (n 1, cs)
func c (n, cs)
| n > 0 = … -- (1)
| otherwise = … -- (2)
如果我們有一個不是 a 的字符#,但這n > 0意味著我們需要洗掉該字符,從而忽略c和遞減n。如果n == 0我們可以添加c到String.
我將填寫…部分作為練習。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/363862.html
