0

純粋な関数型プログラミングでは、関数の引数を変更しません。では、引数であるリストに要素を追加する関数をどのように設計すればよいでしょうか? たとえば、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、返されたノードが新しいノードであるかどうかを示すフラグも返すことだと思います。右?

4

2 に答える 2

3

はい、要素が追加された新しいリストを返す必要があります。

ただし、これにはディープコピーは必要ありません。関数型言語は通常、構造の一部をバージョン間で共有できる永続データ構造を備えているため、たとえば、O(1)時間でリストの前に要素を追加できます。

于 2012-10-21T00:58:23.207 に答える
1

新しいリスト (この場合、古いリストに新しい要素が追加されたリスト) を作成し、それを返す関数を作成します。

于 2012-10-21T00:51:12.097 に答える