クラス/レコードのオブジェクトを別な変数でlet束縛した時、これは値じゃなくて参照です

F#で適当なクラスのオブジェクトを作って、それを他の変数にlet束縛しても、それは値の丸コピーではなくて、参照になるとそういうことです。

> type Hoge(x:int)=
-     member val X = x with get, set;;

type Hoge =
  class
    new : x:int -> Hoge
    member X : int
    member X : int with set
  end

> let x = Hoge 444;;

val x : Hoge

> let y = x;;

val y : Hoge

> y.X <- 1;;
val it : unit = ()
> y.X;;
val it : int = 1
> x.X;;
val it : int = 1

レコードだと値コピーしたりすんのかな?ってやってみたが、こちらも参照。

> type Moge = {mutable X:int};;

type Moge =
  {mutable X: int;}

> let x = {X=100};;

val x : Moge = {X = 100;}

> let y = x;;

val y : Moge = {X = 100;}

> y.X <- 333;;
val it : unit = ()
> y.X;;
val it : int = 333
> x.X;;
val it : int = 333

コピるなら以下のように書くべきか。

> let y = {x with X = 200};;

val y : Moge = {X = 200;}

> y.X;;
val it : int = 200
> x.X;;
val it : int = 333