2015-04-26 87 views
3

我剛碰到一個在Array2D上使用fold/foldi方法會很有用的例子,我想知道,如果有原因,爲什麼Array2D沒有它們。爲什麼Array2D沒有摺疊操作?

由於我的array2d非常龐大,我不想先將它轉換爲其他格式。

難道這只是一個罕見的用例或者是否有技術上的原因,爲什麼這些方法沒有被添加?或者是否有辦法在不觸及數組中的數據的情況下實現同樣的效果?

回答

5

我覺得在標準的Array2D模塊中使用這個功能會非常有用。您可以打開the Visual F# repository的問題,並幫助我們添加它:-)。

除了@scrwtp寫了什麼之外,還可以使用更直接的mutable實現。對於這樣的基本功能,我認爲使用突變是好的,它會更快一點:

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 
2

我不認爲爲什麼Array2D沒有標準的那些功能,因爲它的確有map/mapi。無論如何,使用鋸齒狀數組可能會更好地處理您想要處理多維數組的用例,因此幾乎不需要添加它們。

沒有理由不能自己定義它們。

這裏有一個foldi的例子:

let foldi (folder: int -> int -> 'S -> 'T -> 'S) (state: 'S) (array: 'T[,]) = 
    seq { 
     for x in 0 .. Array2D.length1 array - 1 do 
      for y in 0 .. Array2D.length2 array - 1 do 
       yield (x, y, array.[x, y]) 
    } 
    |> Seq.fold (fun acc (x, y, e) -> folder x y acc e) state 

對於規則的摺疊和更深入的解釋它是如何工作的,你可以看here

相關問題