f#运行总计序列

Aid*_*dan 6 f# functional-programming

好吧,这看起来应该很容易,但我只是没有得到它.如果我有一系列数字,我如何生成由运行总计组成的新序列?例如,对于序列[1; 2; 3; 4],我想将其映射到[1; 3; 6; 10].以适当的功能方式.

ild*_*arn 15

用途List.scan:

let runningTotal = List.scan (+) 0 >> List.tail

[1; 2; 3; 4]
|> runningTotal
|> printfn "%A"
Run Code Online (Sandbox Code Playgroud)

Seq.scan基于实施:

let runningTotal seq' = (Seq.head seq', Seq.skip 1 seq') ||> Seq.scan (+)

{ 1..4 }
|> runningTotal
|> printfn "%A"
Run Code Online (Sandbox Code Playgroud)


Ste*_*sen 14

使用的另一种变化Seq.scan(Seq.skip 1摆脱前导零):

> {1..4} |> Seq.scan (+) 0 |> Seq.skip 1;;
val it : seq<int> = seq [1; 3; 6; 10]
Run Code Online (Sandbox Code Playgroud)

  • 感谢Daniel,F#为我的疾病提供了简洁,优雅的解决方案. (2认同)

Lau*_*ent 5

> Seq.scan (fun acc n -> acc + n) 0 [1;2;3;4];;
val it : seq<int> = seq [0; 1; 3; 6; ...]
Run Code Online (Sandbox Code Playgroud)

有了列表:

> [1;2;3;4] |> List.scan (fun acc n -> acc + n) 0 |> List.tail;;
val it : int list = [1; 3; 6; 10]
Run Code Online (Sandbox Code Playgroud)

编辑:序列的另一种方式:

let sum s = seq {
    let x = ref 0
    for i in s do
        x := !x + i
        yield !x
}
Run Code Online (Sandbox Code Playgroud)

是的,有一个可变变量,但我觉得它更具可读性(如果你想摆脱领先的0).