首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何修复‘*异常: Prelude.head:空列表’

如何修复‘*异常: Prelude.head:空列表’
EN

Stack Overflow用户
提问于 2019-06-16 01:36:53
回答 1查看 381关注 0票数 1

这是一个家庭作业,是为了移除相邻的副本。结果应该是这个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

例如,不可能这样做:

代码语言:javascript
复制
removeAdjacentDuplicates :: Eq a => [a] -> [a]
removeAdjacentDuplicates (x:xs@(y:_))
 | x == y    = x:tail (removeAdjacentDuplicates xs)
 | otherwise = x:removeAdjacentDuplicates xs

所以我试着像这样

代码语言:javascript
复制
removeAdjacentDuplicates = foldr (\x result -> if ( x == (head result)) then result else (x : result)) []

但是当我测试它的时候,它会把*** Exception: Prelude.head: empty list' here扔出去

我以前试过添加removeAdjacentDuplicates [] = []

但是错误是这样的

代码语言:javascript
复制
Equations for ‘removeAdjacentDuplicates’ have different numbers of arguments
      H7-1.hs:24:1-32
      H7-1.hs:25:1-105
   |
24 | removeAdjacentDuplicates [] = []
   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...

我不明白问题在哪里,怎么解决呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-16 01:47:44

如果x == head result[] --而在foldr的第一次迭代中result绝对是[],那么在输入列表不需要foldr执行任何迭代的情况下添加一个特例就是纠正了错误的情况!

与尝试从result列表中提取值不同,您可以将x插入到列表中;因此,请考虑使用以下条件

代码语言:javascript
复制
[x] == take 1 result

而是.-它永远不会死。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56615441

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档