从Haskell列表中删除重复项

时间:2013-10-15 19:04:31

标签: haskell

我正在尝试构建一个接受字符串第一个元素的函数,并从字符串中删除所有其他元素。然后为第二个角色做同样的事情。

即 - “Heello”将成为“Helo”和“Chocolate”“Chlate”

我最初的尝试

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

但这似乎不起作用......建议?

1 个答案:

答案 0 :(得分: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)

或者您可以使用Data.List中的nub

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

运行时间为O(n^2)