代码之家  ›  专栏  ›  技术社区  ›  ryeguy

为什么你只能在函数式语言的列表前添加前缀?

  •  17
  • ryeguy  · 技术社区  · 16 年前

    我只使用了3种函数式语言——scala、erlang和haskell,但在这3种语言中,构建列表的正确方法是将新数据添加到前面,然后反转它,而不是仅仅添加到末尾。当然,您可以附加到列表中,但这会导致构建一个全新的列表。

    这是为什么?我可以想象这是因为列表在内部实现为链表,但为什么不能将它们实现为双链表,这样你就可以在没有惩罚的情况下追加到末尾呢?所有函数式语言都有这种局限性,有什么原因吗?

    5 回复  |  直到 16 年前
        1
  •  21
  •   JaredPar    16 年前

    函数式语言中的列表是不可变/持久的。

    将节点添加到列表末尾需要修改最后一个节点以指向新创建的节点。只有这是不可能的,因为节点是不可变的。唯一的选择是创建一个新节点,该节点与最后一个节点具有相同的值,并指向新创建的尾部。这个过程必须一直重复到列表的前面,从而产生一个全新的列表,该列表是第一个列表的副本,但尾部节点除外。因此更贵。

        3
  •  2
  •   DigitalRoss    16 年前

    因为它更快

        4
  •  2
  •   rvirding    16 年前

    这就是列表的定义方式。列表是

        5
  •  1
  •   Greg Hewgill    16 年前

    通过将列表构造限制为前缀,这意味着任何其他持有对列表某个部分的引用的人,都不会看到它在背后发生意外的变化。这允许高效的列表构造,同时保留不可变数据的属性。

    推荐文章