如何在F#中的特定索引处更改列表中的项目? (无法设置属性“项目”)

时间:2018-07-22 14:44:01

标签: list indexing f#

我正在尝试制作一个井字游戏,用户输入一个2位数的数字。第一个数字是位置,第二个数字是X和O的1或0。我一直在寻找如何更改列表中的项目,但只能找到如何附加或连接项目。

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

2 个答案:

答案 0 :(得分:3)

当您将变量标记为可变变量时(例如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)

一种替代方法是使用可变数组-这样,您可以在给定索引处对元素进行突变,但是如果您正在学习F#,则坚持使用功能数据结构是个好主意。

答案 1 :(得分:-2)

您需要一些排序算法,例如 inserttion 排序。这样,您就可以跟踪匹配矩阵中的哪些对。