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