我正在一个非常大的列表上运行List.scan以计算运行总计.当我完成后,我需要除了扫描输出之外的总数,以便非均匀地划分列表.总数是扫描的最后一个状态输出,我真的想避免额外遍历列表以获得最终状态.我能想到的唯一方法就是传递一个可变引用来累积总数.有没有更好的方法来解决这个问题?
let l = <very large list of int64>
let runningTotal=List.scan (fun s x -> x+s) 0L l
let total= <last element of runningTotal- very inefficient>
doSomething total runningTotal
Run Code Online (Sandbox Code Playgroud)
在F#4.0中,List.mapFold正在添加,这很好地实现了这一点.
[1;2;3;4] |> List.mapFold (fun state elem -> let nxt = state + elem in (nxt,nxt)) 0
// > val it : int list * int = ([1; 3; 6; 10], 10)
Run Code Online (Sandbox Code Playgroud)
List.last也是在4.0中添加,尽管它的性能仍为O(n).如果你想从F#3.1和更早版本的列表中选择最后一个元素,你可以使用它fold,但同样,这是O(n).
let last lst =
lst |> List.fold (fun _ x -> x) Unchecked.defaultof<_>
Run Code Online (Sandbox Code Playgroud)
@ John的解决方案可能是最快最简单的.
| 归档时间: |
|
| 查看次数: |
456 次 |
| 最近记录: |