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)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句