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

Haskell列表累积求和实现咨询:寻找对应函数

解决Haskell列表累积求和的问题

嘿,我正好能帮你搞定这个问题!你要实现的就是**前缀和(累积求和)**功能,Haskell里确实有现成的函数可以直接用——就是你提到的scanl家族的函数,只是你之前可能用错了方式😉

正确的实现方式

其实最简单的写法就是用scanl1函数,它专门用来处理这种不需要额外初始值的累积计算:

cumulativeAmount :: [Integer] -> [Integer]
cumulativeAmount = scanl1 (+)

为什么这个能 work?

scanl1的逻辑特别贴合你的需求:

  1. 拿输入列表的第一个元素作为初始累积值
  2. 依次把后续每个元素和当前累积值相加,生成新的累积值
  3. 把每一步的累积值收集成结果列表

咱们用你的例子验证一下:

  • 输入[1,2,5,8,8,0,4,2],scanl1 (+)会逐步计算:
    1 → 1+2=3 → 3+5=8 → 8+8=16 → 16+8=24 → 24+0=24 → 24+4=28 → 28+2=30
    最终结果正好是[1,3,8,16,24,24,28,30],完全符合预期!

  • 第二个例子[1,4,7,0,5],计算过程就是:
    1 → 1+4=5 → 5+7=12 → 12+0=12 → 12+5=17,结果就是[1,5,12,12,17]

关于你之前的错误

你提到用map和scanl没得到预期结果,大概率是这两种情况:

  • 误用map:map是对列表里每个元素单独应用函数,比如map sum会把每个元素都变成整个列表的总和,这显然不是累积求和的逻辑
  • 用错scanl:scanl需要一个初始值,比如scanl (+) 0 [1,2,5...]会返回[0,1,3,8...],多了一个初始的0,这时候如果用tail去掉第一个元素也能得到正确结果,但scanl1更直接

处理空列表的情况(可选)

如果你的函数需要支持空列表输入(避免报错),可以稍微修改一下:

cumulativeAmount :: [Integer] -> [Integer]
cumulativeAmount [] = []
cumulativeAmount xs = scanl1 (+) xs

这样输入空列表时会返回空列表,更健壮。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:05:27