2014-12-16 5 views
0

Как удалить уникальные элементы в списке, так что остаются только часто встречающиеся элементы (только с использованием функций прелюдии). напримерКак удалить уникальные элементы в списке? Haskell

["abc","abc","a","b","c","b"] 

вернется:

["abc","b"] 

В случае, когда все элементы происходят ровно один раз, все будут возвращены.

Если это помогает, я уже реализовал функцию сортировки.

ответ

1

После сортировки вы можете сопоставлять совпадение с элементами повтора, отбрасывая все остальное.

dropSingles [] = [] 
dropSingles (x:y:rest) | x == y = x:dropSingles (dropWhile (== x) rest) 
dropSingles (x:rest) = dropSingles rest 
+0

'filter' работает другим способом. Вам понадобится '/ =' – DiegoNolan

+0

@ DiegoNolan- мой плохой, спасибо за улов. Он исправлен. – jamshidh

+0

Часть фильтра не делает то, что я хочу. Он просто удаляет элементы списка с одиночными символами, не удаляя элементы списка, которые встречаются только один раз. – Arthur

2

Как насчет этого?

import Data.List 

getDups :: Ord a => [a] -> [a] 
getDups = map head . filter (\l -> length l > 1) . group . sort 

Сначала вы сортируете список, потому что группа работает только тогда, когда одни и те же элементы смежны. Затем вы фильтруете группы с несколькими элементами. Что вы берете первый элемент каждой группы, потому что вы уже знаете, что есть хотя бы один.

+0

Это очень полезно, однако все равно это делается без использования группы, учитывая, что мне нужно использовать только функции прелюдии? Если нет, я полагаю, я могу попытаться его реализовать. – Arthur

+0

Просто напишите. Я предполагаю, что это домашнее задание. – DiegoNolan

1
import Data.List 

f xs = case nub (xs \\ nub xs) of 
    [] -> xs 
    xs' -> xs' 

main = do 
    print $ f ["abc","abc","abc","a","b","c","b"] -- ["abc","b"] 
    print $ f ["abc","a","c","b"]     -- ["abc","a","c","b"] 

Т.е. удалите каждый элемент один раз и затем возвращайте каждый элемент один раз.

+0

Кратко, но 'nub' несколько абсурдно неэффективен. – dfeuer

Смежные вопросы