我有一份初步清单。我想创建一个新的元素,使它的每个元素都是max
为零,前一个元素+当前元素的总和。两个列表中的第0个元素相同。
# preseudo code
lst = [.....]
newLst = []
newLst[0] = lst[0]
for i <- 1 to lst.length:
newLst[i] = max(0, newLst[i - 1] + lst[i])
我知道这与foldl
有关。但是,它也必须与map
一起使用,因为两个列表都具有相同的大小。但是map
没有累加器。我无法弄清楚如何将它们结合起来。
答案 0 :(得分:4)
您正在寻找scanl1
:
scanl1 :: (a -> a -> a) -> [a] -> [a]
它会返回所有累积的结果,这正是您想要的:
newList = scanl1 (\acc x -> max 0 $ acc + x) oldList
示例:
> scanl1 (\acc x -> max 0 $ acc + x) [1,2,3,4,-10,-20,1,2,-2,10]
[1,3,6,10,0,0,1,3,1,11]