代码之家  ›  专栏  ›  技术社区  ›  Ronald Wildenberg

F#中的初始状态列表.扫描

f#
  •  2
  • Ronald Wildenberg  · 技术社区  · 14 年前

    我有一个简单的问题,作为一个新手,我似乎不知道该怎么做。我有一个元组列表:

    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 . 我不想指定第一个元组元素的某个“空”实例。

    还是有更简单的方法?

    1 回复  |  直到 14 年前
        1
  •  10
  •   desco    14 年前

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

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