由于Numeri表明,通过在逆转列表中移除第一次出现移除最后一次出现是一种方法:
removeFirst :: Char -> String -> String
removeFirst _ [] = []
removeFirst c1 (c2:cs) = if c1 == c2 then cs else c2:removeFirst c1 cs
removeLast :: Char -> String -> String
removeLast c1 = reverse . removeFirst c1 . reverse
于是威尔内斯指出,返回其最后一次出现被删除的字符串,一布尔值来表示当前事件是否应该被删除,是另一种:
removeLast :: Char -> String -> String
removeLast c1 = snd . remLast
where
remLast :: String -> (Bool, String)
remLast [] = (False, [])
remLast (c2:cs) =
case remLast cs of
(True, cs') -> (True, c2:cs')
(False, cs') -> if c1 == c2 then (True, cs') else (False, c2:cs')
如何反转字符串,然后使用函数?这可能不是你想要的,但它会起作用。 – Numeri
我在想这件事,我确实尝试过,我试图把它全部保留在一个函数中。 –
是的,这就是为什么我试图在一个函数中回答。但是,正如威尔尼斯和凯对我的回答评论的那样,有更好的解决方案。如果您将接受的答案转换为@SimonShine的答案,我更喜欢它,但谢谢! – Numeri