Haskell列表累积求和实现咨询:寻找对应函数
解决Haskell列表累积求和的问题
嘿,我正好能帮你搞定这个问题!你要实现的就是**前缀和(累积求和)**功能,Haskell里确实有现成的函数可以直接用——就是你提到的scanl家族的函数,只是你之前可能用错了方式😉
正确的实现方式
其实最简单的写法就是用scanl1函数,它专门用来处理这种不需要额外初始值的累积计算:
cumulativeAmount :: [Integer] -> [Integer] cumulativeAmount = scanl1 (+)
为什么这个能 work?
scanl1的逻辑特别贴合你的需求:
- 拿输入列表的第一个元素作为初始累积值
- 依次把后续每个元素和当前累积值相加,生成新的累积值
- 把每一步的累积值收集成结果列表
咱们用你的例子验证一下:
输入
[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
相关产品推荐
相关产品推荐

