Ну, у меня есть три, одна стандартная рекурсия, одна foldr
рекурсия и одно понимание списка. Каждый делает то же самое и с любым списком, включая Boolean.
Сначала стандартная рекурсия
rd [] = []; rd (x:xs) = x: rd (filter (/=x) xs)
Это довольно эффективно. Сокращает список до последней главы списка, отфильтровывая совпадения.
Сокращение поддается складкам.
rd2 ls = foldr (\x acc -> x:filter (/=x) acc) [] ls
Этот foldr
делает то же самое, что и rd
до него. Это более кратко, потому что условие остановки неявно, конец списка.
Понимание списка также неявно прекращается.
rd3 ls = [d|(z,d)<- zip [0..] ls,notElem d $ take z ls]
Удаление дубликатов в составных списках - это функция union
. Все это работает без импорта.