List 从haskell中的列表中删除重复项

List 从haskell中的列表中删除重复项,list,haskell,duplicates,List,Haskell,Duplicates,我试图删除列表中连续的重复项;例如,给定列表[1,2,2,3,4],我需要的函数必须返回[1,3,4] 然而,如果列表中有尾随的重复项,如[1,2,3,4,4],则问题末尾的代码不起作用 我也想用尽可能简单的语言来表达,我该怎么做呢 myCom :: Eq a => [a] -> [a] myCom (x:y:ys@(z:_)) | x == y = myCom ys | otherwise = x : myCom (y:ys) myCom ys = ys

我试图删除列表中连续的重复项;例如,给定列表
[1,2,2,3,4]
,我需要的函数必须返回
[1,3,4]

然而,如果列表中有尾随的重复项,如
[1,2,3,4,4]
,则问题末尾的代码不起作用

我也想用尽可能简单的语言来表达,我该怎么做呢

myCom :: Eq a => [a] -> [a]
myCom (x:y:ys@(z:_))
    | x == y    =  myCom ys
    | otherwise = x  : myCom (y:ys)
myCom ys = ys

从注释中,我看到函数
Data.Set.nub
只执行OP要求的操作

但是,我第一次尝试解决此问题的方法是以下方法,仅当重复项是连续的(例如,
[1,2,1,2,1,2]
未更改)时,才会删除重复项:


我希望这个答案对一些最终出现在这个页面上的随机用户有用。

第一个模式匹配您只有至少3个元素的捕获列表。 这就是为什么当重复项位于列表末尾时

myCom [4,4] 
被称为它的简单用途

myCom ys = ys
并返回自身。您可以通过为至少包含2个元素的列表定义myCom来实现这一点,如下所示(您无论如何都没有使用z):

这给

真菌[1,2,2,3,4,4]=[1,3]

3个(奇数)连续数字仍然存在问题。例如,我们得到:

myCom [1,2,2,2] = [1,2]

但是我知道这是我想要的行为。

我会用
也许
来表示一个长度作为成功的条件。这与Haskell的模式匹配语法配合得很好。然后,您可以使用
group
(来自Data.List)并使用
catMaybe
(来自Data.Maybe)过滤掉
Nothing


你是说所有的重复项,还是仅仅是连续的重复项?
nub
nub是O(n^2)。不幸的是,我认为最好的方法是使用
fromList
toList
数据中的函数。设置
,然后只使用
toList。从list
@tex No,
nub[1,2,2,3,4]
[1,2,3,4]
,但OP想要
[1,3,4]
。祝您好运。我误解了要求。我认为这是正确的答案,您只需要调整第一个模式匹配。如果
myCom[1,2,2]=[1,2]
是理想的行为,那么
myCom[1,2,2,2]
应该是什么?是再次使用
[1]
,还是
[1,2,2]
?虽然这很容易阅读,但由于
长度
,仅为了检查没有第二个元素,这可能会导致效率低下。
myCom (x:y:ys)
  | x == y    =  myCom ys
  | otherwise = x  : myCom (y:ys)
myCom ys = ys
myCom [1,2,2,2] = [1,2]
myCom = catMaybes . map lenOne . group
  where lenOne [x] = Just x
        lenOne _   = Nothing