How can you force functional programming immutability on minesweeper table?

I am reading a lot about functional programming and immutability, and have a bit of a problem comprehending how you can make even a simple minesweeper game by not mutating the state? It is obvious that you have an initial state of the minesweeper table in an array ([0,0,0,0] - all tiles are hidden). But how can you reveal the tile if you do not record that change in the state ([0,0,1,0] - first tile in the second row is open)??

Here is a simple example of what I'm saying:

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(0);
console.log(minesweeperTable2x2); // [1,0,1,0]
revealTile(1);
console.log(minesweeperTable2x2); // [1,1,1,0]
revealTile(3);
console.log(minesweeperTable2x2); // [1,1,1,1]

Is there anybody who is into functional programming and immutability and can explain to me this by converting the code I wrote to functional programming paradigm, respecting full immutability???

You can re-create the table every time revealTile is called, and use that new table until it needs to be updated again:

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);

Newest 'immutability' Questions - Page 3, Way to defensive check value assigned to public const variable in immutable How can you force functional programming immutability on minesweeper table? Teams. Q&A for Work. Stack Overflow for Teams is a private, secure spot for you and your coworkers to find and share information.

Most functional programming languages manage immutability for you. JavaScript isn't such a language, so you need to handle it yourself. You could use a library like Immer or Immutable for this, but it's not always necessary. Without a library, the usual approach is:

  1. Create a copy of the object
  2. Change the copy
  3. Replace the original with the copy

In the case of updating a single element of an array, a straightforward implementation would look like this:

function revealTile(table, tileNumber) {
  const nextTable = table.slice(); // create a copy
  nextTable[tileNumber] = 1; // update the copy
  return nextTable; // return the copy
}

let table = [0,0,0,0];

table = revealTile(table, 1);
console.log(table);

table = revealTile(table, 2);
console.log(table);

table = revealTile(table, 0);
console.log(table);

table = revealTile(table, 3);
console.log(table);

Do you need immutability for functional programming?, Of course immutable data structures are great, but are they necessary for FP? Short answer is: no. There's a lot of functional ideas and� Because it is once again a Person you can chain methods. You also can get a fluent-interface by just returning this after each modification. It would look the same. But in the end me and me2 would be references to the same object, and me would be changed. Pure functions. In a functional-only language we could probably stop at this point.

When working with immutability in mind the new state of the minesweeper is always returned by the transition function (revealTile), so that the given state is left intact.

const revealTile = (n, minesweeper) => minesweeper.map(
  (value, i) => i === n ? 1 : value,
);

// ### ----

const minesweeper = [0, 0, 0, 0];

console.log(minesweeper); // [0,0,0,0]

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

How I optimized Minesweeper using Angular 2 and Immutable.js to , So the partition function generates new row objects every time the game data changes and ng-for uses strict equality ( === ) to determine which� In object-oriented and functional programming, an immutable object (unchangeable object) is an object whose state cannot be modified after it is created. This is in contrast to a mutable object (changeable object), which can be modified after it is created. In some cases, an object is considered immutable even if some internally used attributes

Immutable js tutorial, How to build Minesweeper using Angular 2 and Immutable. webpack. Although functional programming is much more than just immutability, many functional Metadata, such as lookup tables, are fetched from a server and persisted When you require immutable data in the component, you need to add the reactDom. This is just the surface of functional programming and all the interesting things you can do with immutability and functional composition. Monads (which you can arguably think of as chained promises) allow you to transform data within a transactional process. That's really the thrust of functional programming: data transformation that doesn't

here, Clojure is predominantly a functional programming language, and features a rich things that require manual dexterity as well as mental effort, such as drawing, minesweeper functionality using pure functions that operate on immutable data. You'll develop clojure apps with both the light table and eclipse development� It looks like a difficult thing but not impossible in many cases, and the functional programming languages like Scala provide you enough language constructs to achieve that. Let me show you a simple loop example, and a solution to achieve immutability.

Build a Minesweeper Game Within 200 Lines of Code, In this tutorial we will learn how to plan and code a minesweeper game Game Design � Platform Agnostic � Game Mechanics � Business � Programming � Game Art Each step from those three parts will be in a separate function; these To make a grid or a series of objects in a table structure, we will� Now we have the got the core minimum minesweeper functionality, so you can finish a minesweeper gameplay using what we've reached up to this point. Section 6: Opening Neighbours Now we want to extend on it for a better game. a common thing in minesweeper games is that if a zone with a value of zero is opened, its surrounding zones are opened

Comments
  • It's important to note that in this code initialTable is not an array but an object with property names that are numeric (but nevertheless strings). In this case it still works, but may cause some surprises. For example, you won't be able to iterate over it with forEach or for ... of, and it doesn't have a length property. Also it may be harder for JavaScript engines to optimize, although in this particular application it probably doesn't matter since your data will always be pretty small.
  • Is this really the way the things are done in functional programming?? You made curried function with new variable for every state change?? But what will you do if you have thousands of state changes, will you make curried function with thousand levels?? Another, less important thing is that you used object, not an array that I used in my original code.
  • @Manzana You're saying "curred" but there's no currying here. Do you mean "recursive" (a function that calls itself)?
  • You're right Jordan, there is no currying, the function is recursive. The thing that's "bothering" me is that you avoided mutating one variable by mutating another. So, you don't mutate initialTable, but you mutate nextTable. It looks like it was easier in any way if you just worked on initialTable in the first place...
  • @Manzana There is no mutation in this code - functional programming avoids mutation. The initialTable object is not being mutated, nor are any of the intermediate currentTable objects. Yes, when you avoid mutation, code does sometimes get harder to write, but if you're trying to use functional programming (as your question implies), this sort of thing is the way to do it.
  • Thanks Jordan. So, in a matter of fact you DO mutate the state, just don't do it inside a function... The function stays pure. I just don't understand all those talks about immutable state?? Every app must record changes... It must mutate the state.
  • This reassigns the table variable though, and functional programming should not reassign variables - in functional Javascript, variables should always be declared with const, right?
  • Yes, but how you will change the next tile? Where you will remember the current state?? This is exactly what I am talking about. In your example, if you do another revealTile(1, minesweeper) all changes that happened before will be forgotten.
  • The currest state could be held by a state manager (redux for instance), or in a variable. The changes that happened before are not lost, since every snapshot is immutable, you will always have access to it. This is a basic time travelling...