Haskell 如何修复';***例外:Prelude.head:空列表';在这里

Haskell 如何修复';***例外:Prelude.head:空列表';在这里,haskell,Haskell,这是一个家庭作业,它的目的是删除相邻的重复。 结果应该是这样的删除相邻的重复项[3,1,2,2,2,2,2,4,4,2,2,3]==[3,1,2,4,2,3] 我知道这里没有必要使用head,但不允许使用rekursion和列出[e |……]形式的理解。只有Prelude中的功能是允许的,组等等,其他包中也不允许地图压缩过滤器concat reverse foldr 例如,不可能做到这一点: removeAdjacentDuplicates :: Eq a => [a] -> [a]

这是一个家庭作业,它的目的是删除相邻的重复。 结果应该是这样的
删除相邻的重复项[3,1,2,2,2,2,2,4,4,2,2,3]==[3,1,2,4,2,3]

我知道这里没有必要使用
head
,但不允许使用rekursion和列出[e |……]形式的理解。只有Prelude中的功能是允许的,
等等,其他包中也不允许<建议使用代码>地图压缩过滤器concat reverse foldr

例如,不可能做到这一点:

removeAdjacentDuplicates :: Eq a => [a] -> [a]
removeAdjacentDuplicates (x:xs@(y:_))
 | x == y    = x:tail (removeAdjacentDuplicates xs)
 | otherwise = x:removeAdjacentDuplicates xs
所以我试着这样做

removeAdjacentDuplicates = foldr (\x result -> if ( x == (head result)) then result else (x : result)) []

但是当我测试它时,它抛出了
***异常:Prelude.head:empty list'这里

我以前尝试过添加
删除相邻的重复项[]=[]

但错误是这样的

Equations for ‘removeAdjacentDuplicates’ have different numbers of arguments
      H7-1.hs:24:1-32
      H7-1.hs:25:1-105
   |
24 | removeAdjacentDuplicates [] = []
   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...

我不明白问题在哪里,我如何解决它?

x==如果
result
[]]
--并且
result
foldr
的第一次迭代中肯定是
[]
,那么headresult
就死了,因此,当输入列表不需要
foldr
进行任何迭代时,添加一个特殊情况就是纠正了错误的情况

您可以在列表中插入
x
,而不是试图从
结果
列表中提取值;所以考虑使用条件

[x] == take 1 result
相反,它永远不会消亡。

如所述,将为空列表引发错误。我们可以通过使用或使用模式匹配来解决此问题:

RemoveAjacentDuplicates::(可折叠f,Eq a)=>f a->[a]
RemoveAjacentDuplicates=foldr f[]
其中f x ys@(y:|x==y=ys
f x ys=(x:ys)
这里的
ys@(y:)
将匹配,因为列表为非空,并且
y
作为列表的标题。在这种情况下,我们检查
x==y
,如果这一点成立,我们返回
ys
。否则我们返回
(x:ys)

removeAdjacentDuplicates :: (Foldable f, Eq a) => f a -> [a]
removeAdjacentDuplicates = foldr f []
    where f x ys@(y:_) | x == y = ys
          f x ys = (x:ys)