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

Haskell合并元组与整数列表 计算分数总和平均值及优化方法

实现方案

1. 按你现有思路实现列表合并

你当前拆分计算的方式可以用zipWith3完成三个列表的拼接,注意要先修正平均分计算逻辑:原来的div是整数除法,无法得到小数结果,调整后的代码如下:

-- 修正平均分计算,保留两位小数
avgList = map (\x -> fromIntegral (round $ fromIntegral x / 3 * 100) / 100) newList

originalList = [("Tom", 87, 78, 67), ("Dick", 56, 45, 72)]
finalList = zipWith3 (\(name, m1, m2, m3) total avg -> (name, m1, m2, m3, total, avg)) originalList newList avgList

2. 更高效的实现方式

你当前的写法需要遍历列表3次(计算总分、计算平均分、合并列表),还需要额外存储两个中间列表,最优的方案是一次遍历直接构造最终结果,不需要中间变量:

processScores :: [(String, Int, Int, Int)] -> [(String, Int, Int, Int, Int, Double)]
processScores = map (\(name, m1, m2, m3) -> 
  let total = m1 + m2 + m3
      avg = fromIntegral total / 3
      roundedAvg = fromIntegral (round $ avg * 100) / 100 -- 保留两位小数
  in (name, m1, m2, m3, total, roundedAvg))

-- 直接调用得到目标结果
finalList = processScores [("Tom", 87, 78, 67), ("Dick", 56, 45, 72)]

这种写法只需要遍历一次列表,空间和时间效率都更高,代码逻辑也更紧凑,不需要维护多个中间列表。

额外建议

如果后续可能调整科目数量,建议把分数存在列表中而非固定长度的元组,比如存储格式改为(String, [Int]),计算总分可以直接调用内置的sum函数,不需要手动适配科目数量。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 14:39:02