您如何在minesweeper表上强制功能编程不变性?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了您如何在minesweeper表上强制功能编程不变性?相关的知识,希望对你有一定的参考价值。

我正在阅读有关函数式编程和不变性的很多文章,并且在理解如何通过不改变状态来制作甚至是一个简单的扫雷游戏时遇到了一个问题。显然,您在数组中具有minesweeper表的初始状态([0,0,0,0]-所有图块均被隐藏)。但是,如果您不记录状态变化([0,0,1,0]-第二行中的第一个图块已打开),如何显示图块?

这里是我所说的简单例子:

let minesweeperTable2x2 = [0,0,0,0];

let revealTile = ( tileNumber ) => 
  minesweeperTable2x2[tileNumber] = 1;


console.log(minesweeperTable2x2); // [0,0,0,0]
revealTile(2);
console.log(minesweeperTable2x2); // [0,0,1,0]

有没有从事函数式编程和不变性的人,可以通过将我编写的代码转换为函数式编程范例,并尊重完全不变性,向我解释这一点?

答案

您可以在每次调用revealTile时重新创建表,并使用该新表,直到需要再次更新它为止:

const initialTable =  ...[0,0,0,0] ;

const revealTile = (lastTable, tileNumber) => 
  return  ...lastTable, [tileNumber]: 1 ;
;
console.log(initialTable);
const nextTable = revealTile(initialTable, 2);
console.log(nextTable);

以上是关于您如何在minesweeper表上强制功能编程不变性?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C# 中使用强制结构和无行为对相关不变数据进行分组

如何在连接表上的两个外键之间强制实施数据库约束?

如何在内存中找到代表 Minesweeper 排雷布局的数据结构?

是否可以选择在雪花表上强制分区

DDD - 如何对跨聚合的集合强制执行不变量

您如何计算在大型 Postgresql 表上创建索引的时间?