You need to enable JavaScript to run this app. Haskell列表推导式实现偶数保留、奇数翻倍的函数开发求助
优惠活动
大模型
产品
解决方案
定价
更多

Haskell列表推导式实现偶数保留、奇数翻倍的函数开发求助

现有实现的问题根源

你当前写的列表推导逻辑存在两个层面的偏差:

  • 列表推导结构中,生成器(x <- a)之后、生成表达式(x*2)之前的逗号分隔项,是元素过滤规则:只有满足规则的元素会被保留到结果列表,不满足的元素会被直接丢弃。
  • 你现在的代码里加了, odd x的过滤条件,相当于把所有偶数元素全部排除在结果之外,再对剩下的奇数元素做乘2处理,自然没法得到“偶数全保留、奇数翻倍”的完整列表。
符合作业约束的修正思路

列表推导的核心逻辑不需要拆分,只要做到两点即可:

  1. 取消所有过滤条件,保证遍历原列表时所有元素都会被纳入结果列表,不会被提前丢弃。
  2. 在列表推导的生成元素位置,直接对每个遍历到的x做分支判断:如果是奇数就返回x*2,如果是偶数就返回原x。
    这里用到的odd是作业明确允许使用的内置函数,*是允许使用的基础运算符,用到的条件判断是Haskell的核心基础语法,不属于作业限制的内置函数范畴,完全符合开发要求。

修正后的完整代码:

doubleOdd :: [Integer] -> [Integer]
doubleOdd [] = []
doubleOdd a = [if odd x then x * 2 else x | x <- a]
效果验证

拿测试输入[1,2,3,4,5]跑逻辑:

  • 遍历拿到的每个元素依次是1、2、3、4、5,没有任何元素被过滤
  • 对每个元素做分支判断:
    • 1是奇数,返回1*2 = 2
    • 2是偶数,返回原2
    • 3是奇数,返回3*2 =6
    • 4是偶数,返回原4
    • 5是奇数,返回5*2=10
  • 最终输出结果为[2,2,6,4,10],完全符合功能要求。

内容的提问来源于stack exchange,提问作者Spartan117

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.23 18:27:04