2010-08-31 53 views
1

我有一個簡單的問題,因爲我是F#新手我似乎無法弄清楚如何做到這一點。我有一個元組列表:F#中的初始狀態List.scan

let l = [ (a, 2); (b, 3); (c, 2); (d, 6) ] 

,我想變成這樣:

let r = [ (a, 2); (b, 5); (c, 7); (d, 13) ] 

這只是增加了在每個元組的第二個元素的值:2 + 3 + 2 + 6。對象a,b,cd是我只想保留的複雜對象。

我以爲我應該用List.scan這個。它需要一個列表,通過計算線程累加器並返回一個列表:

let r = l |> List.scan (fun (_, s) (o, i) -> (o, s + i)) (??, 0) |> List.tail 

但是我不知道要填什麼問號。除了0之外,我對初始狀態不感興趣。我不想指定第一個元組元素的某個「空」實例。

還是有一個更簡單的方法呢?

回答

8

您可以使用第一個元素作爲初始狀態:

let l = [ ("a", 2); ("b", 3); ("c", 2); ("d", 6) ] 

let x::xs = l 
let res = (x, xs) ||> List.scan (fun (_, x) (o, n) -> o, x + n) // [("a", 2); ("b", 5); ("c", 7); ("d", 13)] 

與空列表特殊情況應分開處理

+0

這就是我一直在尋找一種簡單的解決方案。謝謝。我以前沒有遇到||>運算符,但我想它只是將兩個操作數輸入到表達式中? – 2010-08-31 08:31:54

+0

是的,它是雙管道運算符,定義如下:let(||>)(a,b)f = f a b – desco 2010-08-31 08:35:23