Haskell递归处理嵌套列表触发Non-exhaustive patterns报错如何解决
问题原因解释
你遇到的非穷尽模式异常和子列表是否为空无关,核心问题是递归函数缺少外层空列表的终止匹配分支:
- 当前你只定义了
multiply (x:xs)的匹配规则,仅适用于非空的外层嵌套列表 - 递归执行到最后外层列表被遍历完、剩余空列表
[]时,没有对应的处理分支,因此抛出异常 - 你运行代码时已经输出了空子列表
[],说明列表推导语法已经自动支持处理空子列表的场景,不需要额外修改子列表的处理逻辑。
修复方案
最简递归修复
补全空列表的终止匹配分支即可:
list = [[1, 3, 6.7, 7.0], [], [1, 8.22, 9, 0]] -- 补全空列表匹配的终止条件 multiply [] = [] multiply (x:xs) = [n * (-1) | n <- x] : multiply xs
运行后即可得到正确结果,不会抛出异常。
更简洁的函数式写法
你可以直接用高阶函数map实现嵌套遍历,不需要手动写递归,也不会出现递归终止条件漏写的问题:
multiply = map (map (* (-1)))
外层map遍历外层列表的每个子列表,内层map遍历子列表的每个元素,执行乘-1的操作,逻辑和手动递归完全一致。
内容的提问来源于stack exchange,提问作者bami77
相关产品推荐
相关产品推荐

