@KarlBielefeldtが指摘したように、このような問題に対する機能的なアプローチは、以前の状態から新しい状態を返すと見なすことです。関数自体は情報を保持しないため、常に状態mを状態nに更新します。
新しい状態を計算している間、以前の状態をメモリに保持する必要があると仮定するため、この非効率性を見つけると思います。完全に新しい状態を記述するか、古い状態を所定の位置に書き直すかの選択は、関数型言語の観点からの実装の詳細であることに注意してください。
たとえば、100万個の整数のリストがあり、10単位を1単位増やしたいとします。10番目の位置に新しい番号を付けてリスト全体をコピーするのは無駄です。ただし、これは操作を言語コンパイラーまたはインタープリターに説明する概念的な方法にすぎません。コンパイラまたはインタープリターは、最初のリストを自由に取得して、10番目の位置を上書きするだけです。
この方法で操作を記述することの利点は、多くのスレッドが異なる位置で同じリストを更新したい状況についてコンパイラーが推論できることです。操作が「この位置に移動して、見つけたものを上書きする」と記述されている場合、上書きが衝突しないことを確認するのは、コンパイラーではなくプログラマーです。
以上のことから、Haskellでも、「状態を維持する」ことが問題に対するより直感的な解決策である状況をモデル化するのに役立つStateモナドがあります。しかし、「データベースへの書き込みのように本質的にステートフル」な問題には、Datomicのような不変のソリューションがあることに注意してください。これは概念であり、必ずしもその実現ではないことを理解するまで驚くかもしれません。