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)

_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to