在纯函数式编程中,我们不修改函数的任何参数。然后,我们如何设计一个向其参数添加元素的函数,列表?例如,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
,还返回一个标志,指示返回的节点是否为新节点。正确?
答案 0 :(得分:3)
是的,您必须返回添加了元素的新列表。
但是,这不需要深层复制。功能语言通常具有persistent data structures功能,允许在版本之间共享部分结构,以便您可以在在O(1)时间内将元素添加到列表中。
答案 1 :(得分:1)
您可以编写一个函数来构建一个新列表(在这种情况下,一个新元素添加到旧列表中)&amp;归还那个。