2013-10-15 306 views
0

我正在嘗試構建一個函數,它接受一個字符串的第一個元素,並從字符串中刪除所有與它相同的其他元素。然後爲第二個字符做同樣的事情。刪除Haskell列表中的重複項

IE瀏覽器 - 「Heello」 就成了 「直升機」 和 「巧克力」, 「Chlate」

我最初的嘗試

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

但是,這似乎並沒有工作..建議?

+0

你看過'Data.List.nub'嗎? – bheklilr

+0

按'x! \'elem \''',我想你可能是指'不是(elem c x)'。 Haskell不使用邏輯否定'!',elem'以其他順序(它的類型是'a - > [a] - > Bool',而不是'[a] - > a - > Bool '。 –

+0

'不是(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),我認爲。

或者你可以使用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