是否复制和更新F#中的不可变记录类型共享或复制内存?

wye*_*r33 8 .net f# functional-programming

F#中不可变记录的复制和更新过程是共享还是复制内存?含义,在以下代码中

type MyRecord = {
    X: int;
    Y: int;
    Z: int 
    }

let myRecord1 = { X = 1; Y = 2; Z = 3; }
let myRecord2 = { myRecord1 with Y = 100; Z = 2 }
Run Code Online (Sandbox Code Playgroud)

为变量做myRecord1myRecord2共享内存X?更一般地说,是否有一个很好的引用,它准确表示F#中哪些不可变/持久数据结构主动共享内存?

Fyo*_*kin 10

在这种情况下,X将复制变量的内存.代码的最后一行实际上只是另一种写法:

let myRecord2 = { X = myRecord1.X; Y = 100; Z = 2 }
Run Code Online (Sandbox Code Playgroud)

现在,如果X是引用类型,则可以复制用于引用它的内存,但是其内容的内存将被共享.

例如,考虑一下:

type MyX = { W: int; U: int }
type MyRecord = {
    X: MyX;
    Y: int;
    Z: int 
    }

let myRecord1 = { X =  { W = 5; U = 6 }; Y = 2; Z = 3; }
let myRecord2 = { myRecord1 with Y = 100; Z = 2 }
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,存储器X会被复制,但记忆WU 将被共享.

  • 一般来说,经验法则是:除非明确声明值类型,否则任何复合都是引用类型.要在F#中声明值类型,请使用`[<Struct>]`标记它.我理解结构所代表的不可变类型的情感冲动,因为它们在某种程度上更"僵硬"和"轻量级",但如果你考虑它,这实际上会适得其反:如果你知道类型是不可变的,那它才有意义保留它的一个副本,只传递对该副本的引用. (4认同)
  • @YotaXP是的.同时,一个不可变的记录看起来更像一个结构,显然它是一个引用类型. (3认同)
  • 确定某些东西是引用类型还是值类型的最简单方法是什么?例如,我不知道不可变记录将被视为引用类型. (2认同)