f# - 相当于Array.scan |> Array.skip 1,但是不创建中间数组?

标签 f#

Array.scan函数返回一个长度为 n+1 的数组,其中 n是其输入数组的长度,其第一项是传递给 Array.scan 的初始状态.例如。,

[|1;2;3;4|] |> Array.scan (+) 0  // Returns [|0;1;3;6;10|]

然而,我通常发现这不是我想要的:我想要一个长度为 n 的数组。 , 没有在我的输出数组中保留初始状态。我只需执行以下操作即可轻松获得此结果:
input |> Array.scan f initialState |> Array.skip 1

但这将创建一个立即丢弃的中间数组。有没有一种好方法可以在不创建中间数组的情况下获得此结果?我可以很容易地自己实现:
let scanWithoutInitial f initState input =
    let result = Array.zeroCreate (Array.length input)
    let mutable state = initState
    for i = 0 to (Array.length input - 1) do
        state <- f state input.[i]
        result.[i] <- state
    result

但是,重新实现我认为应该在标准 F# 核心库中的东西似乎需要做很多工作。有没有我忽略的功能?或者我是唯一一个有这个用例的人,大多数人都希望初始值作为他们 Array.scan 的第一项。结果?

最佳答案

mapFold正是这样做的:

Array.mapFold (fun acc x -> (acc + x, acc + x)) 0 [|1;2;3;4|] |> fst
如需更多脑筋急转弯,请参阅 this post .

关于f# - 相当于Array.scan |> Array.skip 1,但是不创建中间数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43122745/

相关文章:

f# - 嵌套函数调用中的 printfn 未在控制台上打印任何内容

data-structures - F# 记录是否支持循环引用 A -> B -> A?

F#创建表达式的自定义属性

f# - 如何在 F# 中对可区分联合的子集进行建模?

c# - Autofac 与 F#

f# - "Language Oriented Programming"与现实世界中的 OOP/Functional 相比如何

.net - F#:函数中有更多返回点,如何处理?

F# Main argv 和 if 语句混淆

.net - 如何从 F# dll 重建 F# 程序集签名

f# - 如何抑制编译器对不完整模式匹配的警告