How to calculate the "sliding sliced" fold of an array of int arrays in F#? -
i have function called calcarr_arrofarr
in f# signature int [] -> int [][] -> int
, i.e. calcarr_arrofarr
takes 2 arguments, int array , array of int arrays, , returns int.
i want create function calcarrofarr
signature int [][] -> int
, following:
let calcarrofarr (arrofarr : int [][]) = array.fold (fun acc e -> acc + (calcarr_arrofarr e arrofarr.[?..])) 0 arrofarr
where ?
index of e
+ 1.
in other words, in calcarrofarr
want apply calcarr_arrofarr
every element e
of arrofarr
plus "remaining portion" of arrofarr
, i.e. slice of arrofarr
starting after element e
. of course, last element of arrofarr
, nothing added accumulator, nor exception thrown.
there way create calcarrofarr
in functional way? array.foldi
function come handy...
if feel need array.foldi, write one! following snippet extend built-in array module foldi:
module array = let foldi f z = |> array.fold (fun (i,a) x -> i+1, f x) (0,z) |> snd
slicing past-the-end gives empty array (i.e., [|0;1|].[2..] = [||]
), original suggestion works:
let calcarrofarr (arrofarr : int [][]) = array.foldi (fun acc e -> acc + (calcarr_arrofarr e arrofarr.[i+1..])) 0 arrofarr
however, slice arrofarr.[i+1..]
copies array slice; might unfortunate efficiency.
Comments
Post a Comment