从 Haskell 中的列表中删除重复项

ace*_*emi 0 haskell list 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
Run Code Online (Sandbox Code Playgroud)

sho*_*kos 5

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

myCom [4,4] 
Run Code Online (Sandbox Code Playgroud)

被称为它只是使用

myCom ys = ys
Run Code Online (Sandbox Code Playgroud)

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

myCom (x:y:ys)
  | x == y    =  myCom ys
  | otherwise = x  : myCom (y:ys)
myCom ys = ys
Run Code Online (Sandbox Code Playgroud)

这给

myCom [1,2,2,3,4,4] = [1,3]

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

myCom [1,2,2,2] = [1,2]
Run Code Online (Sandbox Code Playgroud)

但我明白这是理想的行为。