Haskell:列表的列表操作语法调试求助
解决Haskell二维列表逐元素相加的模式匹配问题
我来帮你理清这个Haskell代码的问题,核心是你对列表嵌套的模式匹配语法理解有偏差,咱们一步步拆解:
首先明确你的需求:你想要实现两个同结构的二维列表逐位置逐元素相加——对应外层列表里的子列表两两配对,子列表里的每个元素也两两相加,最终返回结构一致的二维列表,对吧?
你的代码存在的问题
模式匹配语法错误
你写的[(x:xs):tx]是在匹配仅包含单个元素的外层列表,这个元素是(x:xs):tx(也就是一个非空列表,它的头部是x:xs,尾部是tx)。但你真正需要的是匹配:外层列表的第一个元素是一个非空子列表x:xs,外层列表剩下的部分是后续的子列表tx。所以正确的模式应该是((x:xs):tx)(去掉外层的方括号)。基础case覆盖不全
你的sumLsts [[]] [[]] = [[]]只能处理两个外层列表都仅含一个空列表的极端情况,但实际场景中我们需要覆盖更多边界:- 两个外层列表都为空的情况(递归终止的基础case)
- 两个外层列表的当前子列表都为空的情况(处理子列表长度一致但为空的场景)
类型签名缺少约束
原来的类型签名[[a]] -> [[a]] -> [[a]]没有指定a需要支持加法操作,编译时会报错,需要加上Num a约束。
修正后的完整代码
sumLsts :: Num a => [[a]] -> [[a]] -> [[a]] -- 两个空外层列表,直接返回空(递归终止) sumLsts [] [] = [] -- 当前子列表都为空,生成空列表后继续处理剩余外层列表 sumLsts ([]:tx) ([]:ty) = [] : sumLsts tx ty -- 当前子列表都非空:先相加当前元素,递归处理子列表剩余元素,再递归处理外层列表剩余子列表 sumLsts ((x:xs):tx) ((y:ys):ty) = (x + y : sumLsts xs ys) : sumLsts tx ty
测试你的示例输入
运行你给出的测试用例:
sumLsts [[1,1,1], [1,10,20], [-3, -4, -2]] [[3,5,6],[2,3,4],[2,3,2]]
会得到预期输出:
[[4,6,7],[3,13,24],[-1,-1,0]]
内容的提问来源于stack exchange,提问作者935
相关产品推荐
相关产品推荐

