これは矛盾した表現かもしれませんが、関数型プログラミング スタイルでデータ エンティティを更新するにはどうすればよいでしょうか。私が読んだ限りでは、関数型プログラミングは変換を使用して不変エンティティの出力を返します。私が考えることができる唯一のことは、元のエンティティを完全に置き換えることですが、それは従来の更新アプローチとほとんど同じようです.
3 に答える
ディスクデータベースエンティティまたはメモリ内のデータ構造について話しているのですか。
後者の場合、関数型言語は永続的なデータ構造を使用します。これは、更新後に新しいバージョンと古いバージョンの両方が利用できるように実装されていますが、共通部分を共有しています (効率的であるため)。したがって、まったく新しいデータ構造を返しているように見えますが、実際には、その実装のほとんどを変更していたものと共有しています。
clojure のソース (Java で書かれている) には、見るべき本当に優れた実装がいくつかあります -- そのうちの 2 つをブログで取り上げました。
http://www.loufranco.com/blog/files/20-Days-of-Clojure-Day-7.html
http://www.loufranco.com/blog/files/20-Days-of-Clojure-Day-8.html
簡単に言えば、関数型のスタイルでは、各データ エンティティは不変であるため、更新は実際には更新された値を持つ新しいデータ エンティティであり、.NET での文字列の動作と似ています。
本当に興味深い課題は、IO を扱うときに発生します。純粋に機能的な方法で I/O をモデル化するのは難しくなり、Monadsのような回避策につながります。
ルー・フランコはそれを持っています。関数型言語のデータ構造は、元のエンティティを「完全に置き換える」ことで変更できるように実装されています。舞台裏では、彼らはまだ古いもののほとんどを使用しています。変更されたビットを置き換えるだけです。古いバージョンもまだ存在しますが、誰も参照しない限り、最終的にはガベージ コレクションによって破棄されます。