Як зазначає @KarlBielefeldt, функціональним підходом до такої проблеми є розгляд її як повернення нового стану з попереднього стану. Самі функції не містять ніякої інформації, тому вони завжди оновлюватимуть стан m до стану n .
Я думаю, ви вважаєте це неефективним, оскільки ви припускаєте, що попередній стан повинен зберігатися в пам'яті під час обчислення нового стану. Зауважте, що вибір між написанням абсолютно нового стану або перезаписом старого на місці - це деталізація реалізації з точки зору функціональної мови.
Наприклад, скажіть, що у мене є список мільйона цілих чисел, і я хочу збільшити десяту частину на одну одиницю. Копіювання всього списку з новим номером на його десяту позицію марно, ви маєте рацію; але це лише концептуальний спосіб опису операції мові компілятору чи інтерпретатору. Укладач або перекладач вільний взяти перший список і просто переписати десяту позицію.
Перевага опису операції таким чином полягає в тому, що компілятор може міркувати про ситуацію, коли багато потоків хочуть оновити один і той же список на різних позиціях. Якщо операцію описано як "перейти до цієї позиції та перезаписати те, що ти знайдеш", тоді перекладач, а не компілятор, відповідає за те, щоб перезаписи не стикалися.
З урахуванням сказаного, навіть у Хаскелл існує державна монада, яка допомагає моделювати ситуації, коли "утримання держави" є більш інтуїтивним рішенням проблеми. Але, будь ласка, також зауважте, що деякі проблеми, які, як ви вважаєте, за своєю сутністю, як запис у базу даних, мають такі незмінні рішення, як Datomic . Це може дивувати, поки ви не зрозумієте, що це концепція, не обов'язково її реалізація.