F# 使用Array2D时是否可以返回seq?

F# 使用Array2D时是否可以返回seq?,f#,F#,我想将矩阵的非零元素收集到序列中 这不管用 let getSparseMatrixCOO matrix = seq { matrix |> Array2D.iteri (fun row column elem -> if elem <> 0.0 then yield (row, column, elem)

我想将矩阵的非零元素收集到序列中

这不管用

let getSparseMatrixCOO matrix =
    seq {
          matrix |> Array2D.iteri (fun row column elem -> 
                                    if elem <> 0.0 then yield (row, column, elem)
                                  )
        }
让getSparseMatrixCOO矩阵=
序号{
矩阵|>Array2D.iteri(有趣的行-列元素->
如果元素为0.0,则屈服(行、列、元素)
)
}

我必须放弃使用
Array2D.iteri

在这样的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) }
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
缺少的
Array2D.foldi
函数可以这样实现(为了保持简单,必须这样做):

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) }
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
模块阵列2d=
设foldi f a矩阵=
设可变状态=a
对于0中的行。。阵列2D.length1矩阵-1 do
对于0中的列。。阵列2D.Length 2矩阵-1 do

state您可以继续坚持使用以下内容

let getSparseMatrixCOO matrix =
    let result = ref List<int*int*float>.Empty
    matrix |> Array2D.iteri(fun i j elem -> if elem <> 0.0 then result := (i,j,elem)::!result)
    !result |> List.rev
让getSparseMatrixCOO矩阵=
让result=ref List.Empty
矩阵|>Array2D.iteri(有趣的元素->如果元素0.0,那么结果:=(i,j,元素)::!结果)
!结果|>List.rev
如果你的原始意图的懒惰并不重要,因为上面的片段会给你相同的顺序,只是渴望而已