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)