Haskell中实现等长列表对应元素求和的简便方法问询
Haskell中合并等长列表对应元素相加的简便实现
嘿,这个需求在Haskell里处理起来特别顺手!毕竟函数式编程本来就不依赖传统循环,而是靠高阶函数和递归来搞定这类问题,最直接的方案就是用标准库的zipWith函数。
核心实现:用zipWith一步到位
zipWith是专门用来处理两个列表的高阶函数——它会把两个列表的对应元素配对,然后用你指定的函数去处理每一对,最后把所有结果收集成一个新列表。针对你的需求,代码超简洁:
zipWith (+) [1,2,3,4,5] [1,2,3,4,5] -- 运行结果就是 [2,4,6,8,10]
这里的(+)就是Haskell里的加法函数,zipWith会自动把两个列表里的1和1、2和2……依次传给+,然后把相加的结果串成新列表。因为你的两个列表是等长的,所以所有元素都会被处理到;如果列表长度不等,zipWith会以较短的那个为准截断,不过你这里完全不用考虑这个问题。
手动实现递归版本(理解原理用)
如果想搞清楚背后的逻辑,也可以自己写一个递归函数来实现同样的功能,毕竟zipWith本质上也是递归实现的:
addCorresponding :: Num a => [a] -> [a] -> [a] addCorresponding [] [] = [] -- 两个空列表相加,结果还是空 addCorresponding (x:xs) (y:ys) = (x + y) : addCorresponding xs ys
调用的时候同样直接:
addCorresponding [1,2,3,4,5] [1,2,3,4,5]
这个递归逻辑很清晰:如果两个列表都空了,就返回空;如果还有元素,就把当前第一个元素相加,然后递归处理剩下的子列表,最后把结果拼接起来。
不过实际开发里肯定优先用zipWith,毕竟是标准库优化过的实现,代码更简洁也更易读~
内容的提问来源于stack exchange,提问作者Prototype
相关产品推荐
相关产品推荐

