删除Haskell列表中的重复项

问题描述:

我正在尝试构建一个函数,它接受一个字符串的第一个元素,并从字符串中删除所有与它相同的其他元素。然后为第二个字符做同样的事情。删除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

你可以保持一组看到的所有元素,只保留当前的一个,如果它尚未见过的:

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