在這樣的lambda函數中不能使用yield
。 yield
關鍵字只能在序列表達式的範圍內直接使用(儘管您的嘗試有一個很好的邏輯)。
我認爲最簡單的辦法是遍歷數組的元素,寫這樣的事:
let getSparseMatrixCOO matrix =
seq { for row in 0 .. Array2D.length1 matrix - 1 do
for column in 0 .. Array2D.length2 matrix - 1 do
let elem = matrix.[row, column]
if elem <> 0.0 then yield (row, column, elem) }
的Array2D
模塊不提供許多功能,但它可以擴展到包括foldi
功能(類似於Array.foldi
)。該函數聚合數組的元素並調用您爲每個元素指定的函數。然後你可以選擇你想要的元素,並以你想要的方式聚合它們。
下面以列表作爲狀態和聚集期間附加非零元素到列表:
Array2D.foldi (fun row column elem state ->
if elem <> 0.0 then (row, column, elem)::state else state) []
缺失Array2D.foldi
功能可以被實現(勢在必行,以保持它的簡單)所示:
module Array2D =
let foldi f a matrix =
let mutable state = a
for row in 0 .. Array2D.length1 matrix - 1 do
for column in 0 .. Array2D.length2 matrix - 1 do
state <- f row column (matrix.[row, column]) state
state