F#新手求助:嵌套循环使用size触发编译错误
搞定你的F# PrintBoard编译错误
嘿,我来帮你搞定这个F#编译错误!你的问题看起来是不小心带了OCaml的语法习惯,导致编译器解析出错啦。
问题根源
你代码里的done关键字是OCaml里的循环结束标记,但F#的for循环根本不需要它!正是这些多余的done让编译器误解了代码结构,才抛出了那个看起来和size相关的错误提示——其实你用size计算索引的逻辑完全没问题哦。
修正后的完整代码
let PrintBoard (board: list<string>) (size: int) : unit = // 打印顶部边框 for i = 0 to size - 1 do printf " ---" printfn "" // 打印每行的单元格内容 for i = 0 to size - 1 do printf "| " for j = 0 to size - 1 do // 这里的List.item调用其实是对的,只是之前的done打乱了编译逻辑 printf "%s" (List.item (i * size + j) board) printf " | " // 删掉了多余的done printfn "" // 打印底部边框 for i = 0 to size - 1 do printf " ---" printfn ""
额外优化小技巧
- 优化列表访问:
List.item对于大列表来说性能不算最优,如果可以的话,把棋盘改成二维列表list<list<string>>,访问元素会更直观:board |> List.item i |> List.item j,甚至可以用board.[i].[j](需要允许索引访问的警告)。 - 简化边框代码:不用循环打印边框,直接用字符串重复更简洁:
printfn "%s" (String.replicate size " ---"),一行顶原来的循环。
举个优化后的示例代码:
let PrintBoard (board: list<list<string>>) (size: int) : unit = let border = String.replicate size " ---" printfn "%s" border for row in board do printf "| " for cell in row do printf "%s | " cell printfn "" printfn "%s" border
这样代码更清爽,也不用手动计算索引啦~
内容的提问来源于stack exchange,提问作者minime
相关产品推荐
相关产品推荐

