2014-02-28 61 views
0

我有一個初始列表。我想創建一個新的元素,使得它的每個元素都是零,並且是前一個元素+當前元素的總和。第二個元素在兩個列表中都是相同的。結合地圖+ foldl?

# 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沒有累加器。我無法弄清楚如何合併它們。

回答

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] 
+0

我可以毫不scanl1使用遞歸? –

+0

當然你可以用遞歸來做。只要看看scanl1是如何定義的。 – augustss

+0

對不起,我找不到它的定義。你的意思是這個http://hackage.haskell.org/package/base-4.6.0.1/docs/Prelude.html#v:scanl1?但這看起來不像一個定義。 –