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