我有一个简单的问题,因为我是一个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
。对象a
,b
,c
和d
是我想要保留的复杂对象。
我认为我应该使用List.scan
。它需要一个列表,通过计算线程累加器并返回一个列表:
let r = l |> List.scan (fun (_, s) (o, i) -> (o, s + i)) (??, 0) |> List.tail
但我不知道该填写什么问题。除了0
之外,我对初始状态不感兴趣。而且我不想指定第一个元组元素的一些“空”实例。
或者有更简单的方法吗?
答案 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)]
空列表的特殊情况应单独处理