相当于Array.scan |> Array.skip 1,但没有创建中间数组?

时间:2017-03-30 15:55:18

标签: 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结果的第一项?

2 个答案:

答案 0 :(得分:4)

mapFold正是如此:

Array.mapFold (fun acc i -> (acc + i, acc + i)) 0 [|1;2;3;4|] |> fst

对于更多的脑力激荡,请参考this post

答案 1 :(得分:0)

[|1;2;3;4|] |> Seq.scan (+) 0 |> Seq.skip 1 |> Seq.toArray