Haskell列表元素乘2函数跳过首元素问题及通用实现咨询
问题原因
你当前编写的dobb函数出现首元素丢失的问题,核心是模式匹配和列表推导的逻辑冲突:
- 当你用
dobb (x:xs)匹配非空列表时,x已经被绑定为列表的第一个元素,xs是列表去掉首元素后的剩余子列表 - 后续的列表推导
[x * 2| x<- xs]仅遍历了剩余子列表xs,完全没有用到已经拆分出来的首元素x,自然会漏掉第一个值的计算
修复方案
方案1:修改你现有的递归写法
只需要把匹配到的首元素也加入计算结果即可:
dobb [] = [] dobb (x:xs) = x * 2 : [x * 2| x<- xs]
方案2:直接用列表推导实现通用函数
你找到的单行列表推导代码只需要把固定的[1..5]替换为函数参数,就能得到适配任意数字列表的通用函数,不需要手动做模式匹配拆分列表:
dobb lst = [x*2 | x <- lst]
调用时直接传入任意列表即可,比如dobb [1,2,3]会返回[2,4,6],dobb [3,5,7]会返回[6,10,14]。
拓展:更符合Haskell惯用风格的写法
对于这种「对列表所有元素做统一变换」的需求,更简洁的写法是直接用map高阶函数:
dobb = map (*2)
内容的提问来源于stack exchange,提问作者Anders Stene
相关产品推荐
相关产品推荐

