我剛碰到一個在Array2D上使用fold/foldi方法會很有用的例子,我想知道,如果有原因,爲什麼Array2D沒有它們。爲什麼Array2D沒有摺疊操作?
由於我的array2d非常龐大,我不想先將它轉換爲其他格式。
難道這只是一個罕見的用例或者是否有技術上的原因,爲什麼這些方法沒有被添加?或者是否有辦法在不觸及數組中的數據的情況下實現同樣的效果?
我剛碰到一個在Array2D上使用fold/foldi方法會很有用的例子,我想知道,如果有原因,爲什麼Array2D沒有它們。爲什麼Array2D沒有摺疊操作?
由於我的array2d非常龐大,我不想先將它轉換爲其他格式。
難道這只是一個罕見的用例或者是否有技術上的原因,爲什麼這些方法沒有被添加?或者是否有辦法在不觸及數組中的數據的情況下實現同樣的效果?
我覺得在標準的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
我不認爲爲什麼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。