这是一个家庭作业,是为了移除相邻的副本。结果应该是这个removeAdjacentDuplicates [3,1,2,2,2,2,2,4,4,2,2,3] == [3,1,2,4,2,3]
我知道没有必要在这里使用head,但它不允许使用rekursion和列表-表e_x的理解.只有前奏曲中的函数是permittet、group和等等,在其他包中也是不允许的。推荐使用map zip filter 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)) []但是当我测试它的时候,它会把*** Exception: Prelude.head: empty list' here扔出去
我以前试过添加removeAdjacentDuplicates [] = [],
但是错误是这样的
Equations for ‘removeAdjacentDuplicates’ have different numbers of arguments
H7-1.hs:24:1-32
H7-1.hs:25:1-105
|
24 | removeAdjacentDuplicates [] = []
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...我不明白问题在哪里,怎么解决呢?
发布于 2019-06-16 01:47:44
如果x == head result是[] --而在foldr的第一次迭代中result绝对是[],那么在输入列表不需要foldr执行任何迭代的情况下添加一个特例就是纠正了错误的情况!
与尝试从result列表中提取值不同,您可以将x插入到列表中;因此,请考虑使用以下条件
[x] == take 1 result而是.-它永远不会死。
https://stackoverflow.com/questions/56615441
复制相似问题