
Philip Armstrong wrote:
On Wed, Jul 11, 2007 at 10:31:36PM +0200, Hugh Perkins wrote:
Ok so I played with the tweaked problem (Unix 'uniq'), and getting it to be lazy. This seems to work:
It's slightly worse than that: unix uniq only eliminates *consecutive* identical lines from its input. If you want to eliminate all duplicates, you have to pipe your input through sort first.
testunique :: Eq a => [a] -> [a] testunique list = testunique' list [] where testunique' :: Eq a => [a] -> [a] -> [a] testunique' [] elementssofar = [] testunique' (x:xs) elementssofar | x `elem` elementssofar = (testunique' elementssofar xs) | otherwise = x : ( testunique' xs (x:elementssofar))
I suspect the author upthread had something more like this in mind:
uniq :: Eq a => [a] -> [a] uniq [] = [] uniq (x:xs) = x : filter (x/=) (uniq2 xs)
Obviously a true 'unique' function has to traverse the entire list before it creates any output, as has been pointed out upthread.
Phil
Close. Actually, the author upstream (i.e. me) had in mind:
uniq :: Eq a => [a] -> [a] uniq [] = [] uniq (x:xs) = x : uniq (filter (/= x) xs)