クラス/レコードのオブジェクトを別な変数で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