Eсти функция в 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 p
имеет точно такую же семантику, как reverse . dropWhile p . reverse
, но может быть разумно ожидать, чтобы быть быстрее постоянным множителем. dropWhileEnd
имеет разные, несопоставимые свойства строгости, чем другие (в некоторых случаях он более строгий и менее строгий).
Можете ли вы выяснить обстоятельства, при которых можно ожидать, что каждый будет быстрее?
Возможный дубликат [Можете ли вы использовать сопоставление образцов для привязки последнего элемента списка?] (Http://stackoverflow.com/questions/7576843/can-you-use-pattern-matching-to-bind-the -last-element-of-a-list) –
Как насчет того, чтобы обратить вспять проблему, вы можете удалить ведущие нули? И если вы не ограничены использованием списков, то может использоваться Data.Sequence. – epsilonhalbe