純粋な関数型プログラミングでは、関数の引数を変更しません。では、引数であるリストに要素を追加する関数をどのように設計すればよいでしょうか? たとえば、function list add (elem, list)
. この質問は、次のスレッドに似ています: Functional Programming: state vs. reassignment。
私の推測の解決策は、入力リストをディープコピーappend
してから、新しいものを操作するような破壊的な操作を使用することです。私は正しいですか?
追加
グラフ コピー アルゴリズムから次のコードをコピーします。
// in Node
public Node deepCopy(Map<Node, Node> isomorphism) {
Node copy = isomorphism.get(this);
if (copy == null) {
copy = new Node();
isomorphism.put(this, copy);
for (Node connection: connections) {
copy.connections.add(connection.deepCopy(isomorphism));
}
}
return copy;
}
グラフをディープ コピーするには、コピーされるすべてのノードを追跡する必要があります。宇宙では、isomorphism
引数を使用してそれを行います。deepCopy
この操作の純粋な機能バージョンを作成する唯一の方法は、変数だけでなくcopy
、返されたノードが新しいノードであるかどうかを示すフラグも返すことだと思います。右?