直到Haskell中模式的最后一次出现为止

Mir*_*lov 5 haskell

dropWhile请求一个谓词并逐个从列表中删除一个元素,直到谓词第一次为假,然后它只返回剩下的内容.例如,您可以从字符串列表中删除元素,直到找到以斜杠开头的字符串:

> dropWhile (not . isPrefixOf "/") ["a", "b", "/c", "d"]
["/c","d"]
Run Code Online (Sandbox Code Playgroud)

但是如果你想连续删除元素直到你最后一次匹配模式呢?例如,Python的os.path.join接受任意数量的字符串参数.如果任何参数以斜杠开头,则忽略所有参数,其余参数与分隔符连接:

>>> os.path.join("a", "/b", "c", "/d", "e")
'/d/e'
Run Code Online (Sandbox Code Playgroud)

如何连续从列表中删除元素,直到最后一次满足某些条件?

Mir*_*lov 7

groupBy允许基于以某种方式比较每两个近元素的谓词对列表的元素进行分组.每次谓词失败时,都会启动新组.因此,要在每次出现斜杠前缀时对元素进行分组,每次字符串以斜杠开头时,我们都应该启动一个新组,因此谓词必须失败:

> groupBy (\x y -> not $ isPrefixOf "/" y) ["a", "/b", "c", "/d", "e"]
[["a"],["/b","c"],["/d","e"]]
Run Code Online (Sandbox Code Playgroud)

因此,通用版本必须如下所示:

dropUntilLast :: (a -> Bool) -> [a] -> [a]
dropUntilLast f = last . groupBy (\x y -> not $ f y)
Run Code Online (Sandbox Code Playgroud)