F#List.scan中的初始状态

时间:2010-08-31 08:09:25

标签: f#

我有一个简单的问题,因为我是一个F#新手,我似乎无法弄清楚如何做到这一点。我有一个元组列表:

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

我想转变成这个:

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

这只是添加每个元组中第二个元素的值:2 + 3 + 2 + 6。对象abcd是我想要保留的复杂对象。

我认为我应该使用List.scan。它需要一个列表,通过计算线程累加器并返回一个列表:

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

但我不知道该填写什么问题。除了0之外,我对初始状态不感兴趣。而且我不想指定第一个元组元素的一些“空”实例。

或者有更简单的方法吗?

1 个答案:

答案 0 :(得分:9)

您可以使用第一个元素作为初始状态:

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)]

空列表的特殊情况应单独处理