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

Haskell实现oddPairs函数 返回两列表对应元素和为奇数的配对并修复代码报错

问题原因

你的代码存在两个核心问题:

  • 遍历截断问题:当对应位置两数之和为偶数时,你直接返回了空列表,直接终止了递归流程,后续的列表元素没有被处理,所以第一个示例中第二个配对和为偶数后,第三个配对就不会被遍历到,只能得到第一个结果。
  • 模式匹配不全问题:你只定义了两个列表都为非空的匹配分支,没有处理任意一个列表为空的边界情况,当递归到列表末尾时,没有对应分支可以匹配,就会抛出Non-exhaustive patterns错误。

修复代码

手动递归实现

oddPairs :: [Int] -> [Int] -> [(Int, Int)]
-- 边界处理:任意列表为空时直接返回空列表
oddPairs [] _ = []
oddPairs _ [] = []
oddPairs (x:xs) (y:ys)
  -- 和为偶数时跳过当前配对,继续处理剩余元素
  | even (x + y) = oddPairs xs ys
  -- 和为奇数时保留当前配对,继续处理剩余元素
  | otherwise = (x, y) : oddPairs xs ys

高阶函数简化实现(更符合Haskell惯用写法)

你也可以直接用zip和filter组合实现,不需要手动写递归,天然避免模式匹配问题:

oddPairs :: [Int] -> [Int] -> [(Int, Int)]
oddPairs xs ys = filter (\(a, b) -> odd (a + b)) $ zip xs ys

验证结果

上述代码可以完全满足你的示例要求:

  • oddPairs [1,2,3] [2,2,2] 输出 [(1,2),(3,2)]
  • oddPairs [1,3,5] [2,4,6] 输出和zip结果完全一致
  • oddPairs [1,2,3] [1,2,3] 输出空列表

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 10:57:04