将列表附加到F#中的另一个列表会导致复制底层对象还是只复制指针?

Chr*_*ian 5 f# functional-programming list

我一直认为,追加一个列表到另一个意味着从第一个列表复制的对象,然后例如如指向附加列表在这里.但是,在这篇博客文章及其评论中,它表示只有复制的指针而不是底层对象.什么是正确的?

Chr*_*ian 6

根据Snowbear的回答,结合两个列表(比问题中第一个引用文章中提出的列表)更准确的图像如下所示.

let FIRST = [1;2;3]
let SECOND = [4;5;6]
let COMBINED = FIRST @ SECOND
Run Code Online (Sandbox Code Playgroud)

附加清单的准确描述

  • 这基本上是正确的,但是,只是为了混淆事物,这对于表示引用类型的值的1,2和3是正确的.如果它们是值类型(例如`int`),那么它们实际上会被复制. (7认同)

Sno*_*ear 3

在函数世界中,列表是不可变的。这意味着节点共享是可能的,因为原始列表永远不会改变。由于第一个列表以空列表结尾,因此必须复制其节点才能将其最后一个节点指向第二个列表。

如果您指的是这个陈述,那么答案似乎非常简单。第一篇文章的作者在谈论列表节点元素时说nodes。节点元素与列表项本身不同。看看第一篇文章中的图片。有从每个元素到下一个节点的箭头。这些箭头是指针。但整数类型(放入列表中)没有这样的指针。可能有某种list node类型包装这些整数并存储指针。当作者说nodes must be copies他正在谈论这些包装被复制时。底层对象(如果它们不是本例中的值类型)将不会被克隆,新的包装器将指向与以前相同的对象。