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
[email protected]
http://www.haskell.org/mailman/listinfo/haskell-cafe