【问题标题】:pure functional programming: how to add an element to a list?纯函数式编程:如何将元素添加到列表中?
【发布时间】:2023-04-09 03:24:01
【问题描述】:

在纯函数式编程中,我们不会修改函数的任何参数。那么,我们如何设计一个函数来添加一个元素到它的参数,一个列表呢?例如,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,而且还返回一个指示返回节点是否为新节点的标志。对吧?

【问题讨论】:

  • @hammar 这才是我真正关心的问题:这种新的对象创建操作可能非常昂贵。

标签: functional-programming


【解决方案1】:

是的,您必须返回一个添加了元素的新列表。

但是,这不一定需要深拷贝。函数式语言通常具有persistent data structures,它允许结构的一部分在版本之间共享,以便您可以例如在 O(1) 时间内将元素添加到列表中。

【讨论】:

    【解决方案2】:

    您将编写一个函数来构建一个新列表(在这种情况下,一个将新元素添加到旧列表中的列表)并返回它。

    【讨论】:

    • +1。大多数函数式语言使用列表结构,其中添加到一端(通常是头部)是微不足道的。请注意,如果您无法修改任何内容,则无需复制其余部分,无论是深度还是其他。多个列表可以共享同一个子列表。
    猜你喜欢
    • 1970-01-01
    • 2012-05-10
    • 2015-08-01
    • 2020-12-19
    • 1970-01-01
    • 2018-09-12
    • 2023-04-04
    • 2014-06-16
    相关资源
    最近更新 更多