结合map + foldl?

时间:2014-02-28 20:20:14

标签: haskell

我有一份初步清单。我想创建一个新的元素,使它的每个元素都是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没有累加器。我无法弄清楚如何将它们结合起来。

1 个答案:

答案 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]