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
相关产品推荐
相关产品推荐

