You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:22:28