You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

F#遍历二维数组报错:类型'obj'不支持枚举语法的问题咨询

F# 二维数组遍历错误解决

为啥报错?

你用for i in g遍历二维数组时踩了个坑:F#的Array2D类型没法直接被for...in当成行序列来遍历,它本身没实现seq<_>或IEnumerable<_>接口,直接遍历的话会被识别成obj类型,自然就报枚举错误了。

几种正确的遍历方式

1. 用索引循环(最通用)

直接通过行列索引访问元素,不管哪个F#版本都能用:

// 创建3x3的int类型二维数组,初始值0
let g = Array2D.create<int> 3 3 0

// 遍历每一行
for i in 0 .. g.GetLength(0) - 1 do
    // 遍历当前行的每一列
    for j in 0 .. g.GetLength(1) - 1 do
        printf "%d	" g[i,j]
    // 每行结束换行
    printfn ""
printfn ""

2. 转成行序列遍历(F# 6+推荐)

F# 6及以上版本可以用Array2D.rows模块方法,直接把二维数组转成行的序列:

open FSharp.Collections.Array2D

let g = Array2D.create<int> 3 3 0

// 直接遍历每一行
for row in rows g do
    // 遍历当前行的每个元素
    for elem in row do
        printf "%d	" elem
    printfn ""
printfn ""

要是用的旧版F#,可以手动提取每行:

let g = Array2D.create<int> 3 3 0

for i in 0 .. g.GetLength(0) - 1 do
    // 提取第i行的一维数组
    let row = g[i,*]
    for elem in row do
        printf "%d	" elem
    printfn ""
printfn ""

3. 扁平化遍历所有元素

如果不需要按行分组,只想把所有元素挨个遍历,可以直接这么写——注意是列优先顺序(先第一列所有行,再第二列):

let g = Array2D.create<int> 3 3 0

for elem in g do
    printf "%d	" elem
printfn ""

内容的提问来源于stack exchange,提问作者Emanuel Boștină

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 15:55:07