[Haskell] Operacja unique i stack overflow

0

Cześć,
Piszę funkcję do usuwania wartości z listy, które nie są unikalne. Tak wygląda moja funkcja:

myunique :: Eq a => [a] -> [a]
myunique xs = let r = [x | x <- xs, (elem x r)] in r

Niestety po wywołaniu dostaje Stack Overflow. Czy ktoś wie czemu tak się dzieje?

0

elem x r musi przeglądnąć wszystkie elementy listy, żeby zwrócić odpowiedź. W szczególności musi przejrzeć pierwszy element. Tylko, że żeby obliczyć pierwszy element, trzeba wywołać elem x r i tak się zagnieżdża w nieskończoność, aż do przepełnienia stosu. Leniwość jest fajna, ale nie wyliczy magicznie elementu, którego nie ma ;).

0

a może tak?

myunique = foldr (union . return) []

0
usun l = map fst $ sortBy (comparing snd) $ concat $ filter (null . tail) $ groupBy ((==) `on` fst) $ sortBy (comparing fst) $ zip l [1..]

n lg n zamiast n^2.

1 użytkowników online, w tym zalogowanych: 0, gości: 1