我正在尝试制作一个井字游戏,用户输入一个 2 位数字。第一个数字是位置,第二个数字是 1 或 0 表示 X 和 O。我一直在寻找如何更改列表中的项目,但只能找到如何附加或连接项目。
open System
let mutable game = [ 1; 2; 3; 4; 5; 6; 7; 8; 9 ]
let mutable won = false
while not won do
printfn "%A" game
let pos = Convert.ToInt16(Console.ReadLine())
// game.[pos.[0]] <- pos.[1] doesn't work
Console.ReadKey() |> ignore
Run Code Online (Sandbox Code Playgroud)
当您将变量标记为可变(如 的情况game)时,这意味着您可以通过为其分配新值来改变变量本身(即game <- [...]),但它不会使数据结构本身可变。在您的情况下,该列表仍然是不可变的。
一种使结构与您所拥有的结构保持相似的方法是生成一个新列表,其中输入的索引处的值已更改,所有其他值都与以前相同。您可以使用List.mapi(我还更改了字符串的解析方式)来执行此操作:
let pos, value = int (input.[0]), int (input.[1])
game <- game |> List.mapi (fun i v -> if i = pos then value else v)
Run Code Online (Sandbox Code Playgroud)
另一种方法是使用可变数组 - 这样,您可以改变给定索引处的元素,但如果您正在学习 F#,那么坚持使用函数式数据结构是个好主意。