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

--
http://www.kantaka.co.uk/ .oOo. public key: http://www.kantaka.co.uk/gpg.txt
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to