2014-12-16 5 views

답변

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

관련 문제