dropWhile
请求一个谓词,并逐个从列表中删除一个元素,直到谓词第一次为假,然后它只返回剩下的内容。例如,您可以从字符串列表中删除元素,直到找到以斜杠开头的字符串:
> dropWhile (not . isPrefixOf "/") ["a", "b", "/c", "d"]
["/c","d"]
但是如果你想连续删除元素,直到你最后一次匹配模式怎么办?例如,Python的os.path.join接受任意数量的字符串参数。如果任何参数以斜杠开头,则忽略所有参数,其余参数用分隔符连接:
>>> os.path.join("a", "/b", "c", "/d", "e")
'/d/e'
如何连续删除列表中的元素,直到最后一次满足某些条件?
答案 0 :(得分:7)
groupBy
允许基于以某种方式比较每两个近元素的谓词对列表的元素进行分组。每次谓词失败时,都会启动新组。因此,为了按每次出现斜杠前缀对元素进行分组,每次字符串以斜杠开头时,我们应该启动一个新组,因此谓词必须失败:
> groupBy (\x y -> not $ isPrefixOf "/" y) ["a", "/b", "c", "/d", "e"]
[["a"],["/b","c"],["/d","e"]]
因此,通用版本必须如下所示:
dropUntilLast :: (a -> Bool) -> [a] -> [a]
dropUntilLast f = last . groupBy (\x y -> not $ f y)
答案 1 :(得分:0)
import Data.List (groupBy)
removeTilLast :: (a -> Bool) -> [a] -> [a]
removeTilLast p = last . groupBy (const $ not . p)