You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 13:27:03