2013-10-15 5 views
0

문자열의 첫 번째 요소를 가져 와서 문자열과 동일한 다른 모든 요소를 ​​제거하는 함수를 작성하려고합니다. 그런 다음 두 번째 문자에 대해서도 동일한 작업을 수행합니다.Haskell 목록에서 중복 항목을 제거하십시오.

즉 - "Heello"가 "힐로"와 "초콜릿" "Chlate을"될 것

내 원래 시도

removeSuccessor :: String -> String 
removeSuccessor x = [c | c <- x, x ! `elem` c] 

하지만 그건 .. 제안을 작동하지 않는 것?

당신이 본 모든 요소의 집합을 유지하고는 아직 보지되지 않은 경우에만 현재를 유지할 수
+0

'Data.List.nub'을 보았습니까? – bheklilr

+0

'x! \'elem \'c', 아마도 당신은 아마도'not (elem c x)'를 의미한다고 생각합니다. Haskell은 논리적 인 부정에'! '을 사용하지 않고'elem'은 다른 순서로 인수를 취합니다 (유형은'[a] -> a -> Bool이 아닌'a -> [a] -> Bool'입니다) –

+0

'not (elem cx)'는'c \'notElem \'x'와 동일합니다 – kqr

답변

5

:

import Data.Set 
removeDups :: Ord a => [a] -> Set a -> [a] 
removeDups [] sofar = [] 
removeDups (x:rest) sofar 
    | member x sofar = (removeDups rest sofar) 
    | otherwise  = x:(removeDups rest (insert x sofar)) 

사용법 :

removeDups "Heello" empty -- "Helo" 
removeDups "Chocolate" empty -- "Choclate" 

실행 시간이 O(n log n)을, I 생각한다.

또는 당신은 nubData.List에서 사용할 수 있습니다

Prelude Data.List> import Data.List 
Prelude Data.List> nub "Heello" 
"Helo" 
Prelude Data.List> nub "Chocolate" 
"Choclate" 

런타임이 O(n^2)입니다.

+0

Nub는 완벽하게 작동합니다 : D – MrD

관련 문제