REDO
(Wie Paweł wies darauf hin, ich habe nicht die Frage beantworten, sondern adressiert nur die uniqifying Bit. Also ging ich über Bord für Spaß unten.)
hier ein rein rekursiv ist, Single-Pass, Matching-only-Methode:
-module(nondupes).
-export([leave_uniques/1]).
leave_uniques(L) ->
lists:reverse(lu(lists:sort(L))).
lu(L = [H,H|_]) -> lu(L, [], dupe);
lu([H|T]) -> lu(T, [H], solo).
lu([H,H], A, dupe) -> A;
lu([_,H], A, dupe) -> [H|A];
lu([H,H], A, solo) -> A;
lu([P,H], A, solo) -> [P,H|A];
lu([H | T = [H|_]], A, dupe) -> lu(T, A, dupe);
lu([_ | T], A, dupe) -> lu(T, A, solo);
lu([H | T = [H|_]], A, solo) -> lu(T, A, dupe);
lu([P | T], A, solo) -> lu(T, [P|A], solo).
Wenn Erfahrungen aus der Vergangenheit ein Richter ist, ist es wahrscheinlich mehr performant auf große Listen als Liste/set Subtraktion - aber die Erfahrungen der Vergangenheit sagt mir auch, dass die meisten der Zeit pe Rformance ist wirklich kein großes Problem. Wie auch immer, das war irgendwie unterhaltsam.
Verwendung:
2> nondupes:leave_uniques([2, 3, 4, 4, 5, 6, 6, 6, 7, 8, 8, 8, 9, 9, 10, 10, 10]).
[2,3,5,7]
Sie können auch 'reduce' mit zwei Sätzen, ein zu halten alle Einträge, die Sie so weit und ein anderer mit den Einzigen gesehen haben. Für jedes Element, wenn es in der Liste gesehen wird, sollten Sie es aus uniq entfernen, sonst fügen Sie beiden hinzu. –
Nur eine kleine Verbesserung: Im Reduzierungsschritt können Sie auch '& Dict.update (& 2, & 1, 1, Fn x -> x + 1 Ende)' anstelle des manuellen Get/Put verwenden. –