【问题标题】:How to pattern match the end of a list?如何模式匹配列表的末尾?
【发布时间】:2016-03-14 23:28:55
【问题描述】:

假设我想删除列表末尾的所有零:

removeEndingZeros :: (Num a, Eq a) => [a] -> [a]
removeEndingZeros (xs ++ [0]) = removeEndingZeros xs
removeEndingZeros xs          = xs

由于参数中的(++) 运算符,这不起作用。如何通过模式匹配确定列表的结尾?

【问题讨论】:

标签: haskell pattern-matching pattern-synonyms


【解决方案1】:

Data.List 中有一个函数可以做到这一点:

dropWhileEnd :: (a -> Bool) -> [a] -> [a]
dropWhileEnd p = foldr (\x xs -> if p x && null xs then [] else x : xs) []

所以你可以删除尾随零

dropWhileEnd (== 0)

另一个非常相似的功能可以这样实现:

dropWhileEnd2 :: (a -> Bool) -> [a] -> [a]
dropWhileEnd2 p = foldr (\x xs -> if null xs && p x then [] else x : xs) []

dropWhileEnd2 preverse . dropWhile p . reverse 具有完全相同的语义,但可以合理地预期会更快。 dropWhileEnd 具有与其他不同的、不可比较的严格性属性(在某些方面更严格,而在其他方面则不那么严格)。

你能弄清楚在什么情况下可以预期每个都更快吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-02
    • 2021-09-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多