Arrays I';我无法将OCaml中的数组与修改隔离开来

Arrays I';我无法将OCaml中的数组与修改隔离开来,arrays,ocaml,mutable,Arrays,Ocaml,Mutable,是完整的代码。我将试着展示一些作品。我正在写一个tic tac toe服务器,通过telnet工作。这是一个游戏板的代表 let empty_board = [| [|EMPTY; EMPTY; EMPTY|]; [|EMPTY; EMPTY; EMPTY|]; [|EMPTY; EMPTY; EMPTY|]|] 数组只使用一次。复制在游戏循环中传递玩家描述符和新棋盘: let prepare_ga

是完整的代码。我将试着展示一些作品。我正在写一个tic tac toe服务器,通过telnet工作。这是一个游戏板的代表

let empty_board = [|
                [|EMPTY; EMPTY; EMPTY|];
                [|EMPTY; EMPTY; EMPTY|];
                [|EMPTY; EMPTY; EMPTY|]|]
数组只使用一次。复制
在游戏循环中传递玩家描述符和新棋盘:

let prepare_game_process pair_of_players= 
 pair_of_players >>= fun (player1, player2) ->  
 send_to_client player1 "You play for X";
 send_to_client player2 "You play for O";
 let new_board = Array.copy empty_board in
 game_loop player1 player2 new_board
但每次新游戏开始时,游戏循环中的所有更改都会反映到原来的空棋盘上:

let make_move x y board token=
 board.(y).(x) <- token;
 board
让make_移动x y板令牌=

线路板。(y)。(x)您只复制外部阵列,而不是单个行阵列。

您只复制外部阵列,而不是单个行阵列。

再次感谢您的帮助。你的意思是我应该使用Array.map进行“深度复制”吗?内部数组在副本中显示为引用,对吗?这就是它们改变的原因,是吗?是的,不过在这种情况下,将
空板
作为一个函数而不是一个值会更容易。或者,您可以更改
make_move
以复制正在更改的两个数组(行和板),使板不可变。再次感谢您的帮助。你的意思是我应该使用Array.map进行“深度复制”吗?内部数组在副本中显示为引用,对吗?这就是它们改变的原因,是吗?是的,不过在这种情况下,将
空板
作为一个函数而不是一个值会更容易。或者,您可以更改
make_move
以复制正在更改的两个数组(行和板),使板不可变。