0

在纯函数式编程中,我们不修改函数的任何参数。那么,我们如何设计一个函数来添加一个元素到它的参数,一个列表呢?例如,function list add (elem, list)。这个问题类似于这个线程:函数式编程:状态与重新分配

我猜测的解决方案是深度复制输入列表,然后使用一些破坏性操作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 回答