rye*_*guy 17 language-agnostic functional-programming
我只使用了3种函数式语言 - scala,erlang和haskell,但在所有这三种语言中,构建列表的正确方法是将新数据添加到前面然后反转它而不是仅仅追加到最后.当然,您可以附加到列表,但这会导致构建一个全新的列表.
为什么是这样?我可以想象这是因为列表在内部实现为链接列表,但为什么它们不能仅作为双链表实现,所以你可以追加到最后没有惩罚?是否有某些原因所有功能语言都有此限制?
Jar*_*Par 21
函数式语言中的列表是不可变的/持久的.
附加到不可变列表的前面是很便宜的,因为你只需要分配一个节点,下一个指针指向前一个列表的头部.没有必要更改原始列表,因为它只是一个单链表,并且指向前一个头的指针无法看到更新.
将节点添加到列表的末尾需要修改最后一个节点以指向新创建的节点.只有这是不可能的,因为节点是不可变的.唯一的选择是创建一个与最后一个节点具有相同值并指向新创建的尾部的新节点.此过程必须一直重复到列表的前面,从而产生一个全新的列表,该列表是除尾节点之外的第一个列表的副本.因此更贵.