Haskell列表推导式实现偶数保留、奇数翻倍的函数开发求助
现有实现的问题根源
你当前写的列表推导逻辑存在两个层面的偏差:
- 列表推导结构中,生成器(
x <- a)之后、生成表达式(x*2)之前的逗号分隔项,是元素过滤规则:只有满足规则的元素会被保留到结果列表,不满足的元素会被直接丢弃。 - 你现在的代码里加了
, odd x的过滤条件,相当于把所有偶数元素全部排除在结果之外,再对剩下的奇数元素做乘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
- 1是奇数,返回
- 最终输出结果为
[2,2,6,4,10],完全符合功能要求。
内容的提问来源于stack exchange,提问作者Spartan117
相关产品推荐
相关产品推荐

