如何修改Haskell的swapElems函数使其适配所有输入场景
问题分析与修改方案
你的代码在调用swapElems ([],[1,2])时出错,核心原因是模式匹配没有覆盖所有可能的输入情况:
- 原代码只处理了空输入列表、单元素输入列表、第一个子列表是多元素的输入列表这几种场景,但像
([],[1,2])这种包含空列表+多元素列表的双元素输入列表,没有对应的匹配模式,会触发非穷尽模式匹配错误。 - 另外,原代码的模式设计是针对整个输入列表的结构,而不是逐个处理每个子列表的交换逻辑,导致灵活性不足。
修改后的代码
我们可以拆分逻辑:先写一个处理单个列表前两个元素交换的辅助函数,再用map遍历输入列表的每个子列表,这样能覆盖所有情况:
swapFirstTwo :: [a] -> [a] swapFirstTwo [] = [] -- 空列表直接返回 swapFirstTwo [x] = [x] -- 单元素列表直接返回 swapFirstTwo (x:y:xs) = y : x : xs -- 交换前两个元素 swapElems :: [[a]] -> [[a]] swapElems = map swapFirstTwo
验证效果
调用swapElems ([],[1,2])会返回([],[2,1]),符合预期;其他测试场景也能正常工作:
swapElems []→[]swapElems [[3]]→[[3]]swapElems [[1,2,3], [4], [], [5,6]]→[[2,1,3], [4], [], [6,5]]
内容的提问来源于stack exchange,提问作者teki2021
相关产品推荐
相关产品推荐

