
David Roundy
On Sun, Aug 07, 2005 at 09:10:03AM -0500, Jonathan Cast wrote:
Henning Thielemann
wrote: Is this function worth to be added to Data.List?
{-| Remove the longest suffix of elements satisfying the predicate. In contrast to 'reverse . dropWhile p . reverse' this works for infinite lists, too. -} dropWhileRev :: (a -> Bool) -> [a] -> [a] dropWhileRev p = foldr (\x xs -> if p x && null xs then [] else x:xs) [] ... What do you mean by ``works for inifinite lists''?
(I don't know if the following is what Hennig meant, but it's what I understood.)
It "works for infinite lists that don't have an infinite sequence of matching elements". Even for such problematic lists the above will work until you hit that matching sequence.
take 10 $ dropWhileRev (/= 2) ([1..])
works. But with the "obvious" implementation you'll *always* get failure on infinite lists.
Ah. dropWhileRev p xn is not what I would expect (I would expect (take n xn where n = max n. forall i >= n. p (xn !! i))), but it is the most defined computable approximation to it. Jon Cast