
Henning Thielemann
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) []
Quick query: this function only delivers partial lists from partial lists; hence, it only returns partial lists and infinite lists from infinite lists (In particular, it is not true that, if (exists n. take n (dropWhileRev p xn) /= take n xn) then (dropWhileRev p xn `isPrefixOf` xn = True). Prelude> let dropWhileRev p = foldr (\x xs -> if p x && null xs then [] else x:xs) [] Prelude> dropWhileRev (const True) (repeat 'c') "*** Exception: stack overflow Prelude> dropWhileRev (\n -> n `mod` 2 == 0) ([1..3]++repeat 2) [1,2,3*** Exception: stack overflow Prelude> What do you mean by ``works for inifinite lists''? Jon Cast