You need to enable JavaScript to run this app. 如何实现Haskell中元组列表的每个二元组元素求和?
优惠活动
大模型
产品
解决方案
定价
更多

如何实现Haskell中元组列表的每个二元组元素求和?

Haskell 元组列表逐元素求和实现方案

现有代码的核心问题

你目前写的函数匹配逻辑仅能处理仅含1个元组的列表:

  • 模式sumexample [(a, b)] = a + b 会把输入列表锁定为固定长度1的结构,碰到空列表、多元素列表会直接触发非穷尽匹配的运行错误,完全没有遍历整个列表的逻辑支撑。

逐元组求和的正确实现

Haskell中对列表做逐元素变换、生成新列表有两种最常用的实现方式:

1. 直接用高阶函数map(最简洁)

不需要手动写遍历逻辑,map会自动遍历整个输入列表,对每个元素应用求和变换:

sumexample :: [(Double, Double)] -> [Double]
-- 对每个二元组拆解分量a、b,计算两数之和
sumexample = map (\(a, b) -> a + b)

拿你的样例输入跑这个函数,会直接返回结果列表[8.6, 5.9, 6.4, 8.7],完全匹配你定义的函数签名。

2. 显式递归实现(直观理解遍历逻辑)

如果想不依赖map、手动实现列表遍历的逻辑,可以按照列表的结构拆分支匹配,和map的执行逻辑完全等价:

sumexample :: [(Double, Double)] -> [Double]
-- 匹配空列表:递归终止,返回空结果
sumexample [] = []
-- 匹配非空列表:把当前第一个元组拆出来算和,剩余部分递归处理
sumexample ((a, b):rest) = (a + b) : sumexample rest

生成要求格式的最终输出

算出纯数值的和列表后,只需要把每个结果和对应的序数标签配对,拼接成要求格式的字符串即可:

-- 你的输入样例
example = [(5.4, 3.2), (2.4, 3.5), (2.4, 4.0), (5.1, 3.6)]
-- 逐元组求和
sums = sumexample example
-- 准备对应位置的序数标签
labels = ["First", "Second", "Third", "Fourth"]
-- 配对标签和求和值,拼接成最终输出行
finalOutput = [label ++ ": " ++ show s | (label, s) <- zip labels sums]

运行后finalOutput的内容和你预期的输出完全一致:

First: 8.6
Second: 5.9
Third: 6.4
Fourth: 8.7

内容的提问来源于stack exchange,提问作者randomdude

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.29 09:27:00