dropWhile
要求一个谓词并从列表中一个元素中删除一个元素,直到谓词第一次为假,然后它才返回剩下的内容。例如,您可以从字符串列表中删除元素,直到找到以斜杠开头的字符串为止:
> dropWhile (not . isPrefixOf "/") ["a", "b", "/c", "d"]
["/c","d"]
但是,如果您要连续删除元素,直到最后一次匹配模式,该怎么办?例如,Python的os.path.join接受任意数量的字符串参数。如果任何参数以斜杠开头,则所有先前的参数都将被忽略,其余的参数则以分隔符连接:
>>> os.path.join("a", "/b", "c", "/d", "e")
'/d/e'
如何连续从列表中删除元素,直到最后一次满足某些条件?
最佳答案
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)
关于haskell - 放下直到Haskell中的图案最后一次出现,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25099694/