删除Haskell列表中的重复项
问题描述:
我正在尝试构建一个函数,它接受一个字符串的第一个元素,并从字符串中删除所有与它相同的其他元素。然后为第二个字符做同样的事情。删除Haskell列表中的重复项
IE浏览器 - “Heello” 就成了 “直升机” 和 “巧克力”, “Chlate”
我最初的尝试
removeSuccessor :: String -> String
removeSuccessor x = [c | c <- x, x ! `elem` c]
但是,这似乎并没有工作..建议?
答
你可以保持一组看到的所有元素,只保留当前的一个,如果它尚未见过的:
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)
,我认为。
或者你可以使用nub
从Data.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
你看过'Data.List.nub'吗? – bheklilr
按'x! \'elem \''',我想你可能是指'不是(elem c x)'。 Haskell不使用逻辑否定'!',elem'以其他顺序(它的类型是'a - > [a] - > Bool',而不是'[a] - > a - > Bool '。 –
'不是(elem cx)'与'c \'notElem \'x'是一样的东西 – kqr