为什么Array2D没有折叠操作?

时间:2015-04-26 04:13:58

标签: f#

我刚碰到一个案例,在Array2D上使用fold / foldi方法会很有用,我想知道,如果有原因,为什么Array2D没有它们。

由于我的array2d非常庞大,我不想先将它转换为其他格式。

这只是一个罕见的用例还是有技术原因,为什么没有添加这些方法?或者有没有办法实现相同而不触及数组中的数据(如移动它)?

3 个答案:

答案 0 :(得分:5)

我认为在标准Array2D模块中使用此功能非常有用。您可以为the Visual F# repository打开问题并帮我们添加: - )。

除了@scrwtp编写的内容之外,您还可以使用更直接的可变实现。对于像这样的基本功能,我认为使用变异很好,而且速度会快一些:

let foldi (folder: int -> int -> 'S -> 'T -> 'S) (state: 'S) (array: 'T[,]) =
    let mutable state = state
    for x in 0 .. Array2D.length1 array - 1 do
        for y in 0 .. Array2D.length2 array - 1 do
            state <- folder x y state (array.[x, y])
    state

答案 1 :(得分:3)

我不认为Array2D在标准中没有提供这些功能的任何特殊原因,因为它确实有map / {{1} }。可能通过使用锯齿状数组可以更好地处理您想要处理多维数组的用例,因此添加它们的动机很小。

没有理由不能自己定义它们。

这是一个折叠的例子:

mapi

对于常规折叠以及更深入解释其工作原理,您可以查看here

答案 2 :(得分:0)

如果需要使用折叠功能,通常会使用Seq.cast,但这仅适用于折叠(不适用于foldi)。

我正在添加此解决方案,例如,如果需要,请扫描:

let array2dFold folder (state:'State) (source:'T[,]) =
      source
      |>   ( Seq.cast<'T> >> Seq.fold folder state ) 

由于它确实依赖突变,因此很可能比以前的解决方案要慢。