参照型

参照型を使えば、値を変更可能(mutable)にできます。 (正確には、束縛した値は変わらないのですが 束縛した値の参照先の値の変更が可能になります) 値を参照型に変更するにはrefを使います。 F#6.0では 値の参照は参照型.Value 値の変更は参照型.Value <- 値 とすることで行えます。 また、推奨されなくなった構文となりましたが !参照型とすることで、値の参照が、 参照型:=値とすることで値の変更を行うことができます。 この構文はOCamlと互換性があります。 この'a ref型はMicrosoft.FSharp.Core.Ref<'a>型のシノニムになっています。
参照型の利用
//参照型の値をaに束縛
let a = ref "hello";;
//aの値を参照
a.Value + " world";;
//aの値を変更
a.Value <- "hi";;
//aの値を参照
a.Value + " world";;
実行結果
> let a = ref "hello";;
val a: string ref = { contents = "hello" }

> a.Value + " world";;
val it: string = "hello world"

> a.Value <- "hi";;
val it: unit = ()

> a.Value + " world";;
val it: string = "hi world"

a.Value + " world"の実行結果に注目すると 同じ式であるにも関わらず実行結果が異なっています。 これは参照型を用いると値が変更できる(=副作用を持つ)ためです。 このように、副作用があると 「同じ式は同じ値を持つ」 という性質は失われてしまいます。 その他、並列処理なども記述が難しくなるなど 副作用にはデメリットが多く 関数型プログラミングでは一般に 副作用のあるプログラムは嫌われるようです。 この他、mutableキーワードを用いて同様のことは行うことができます。 基本的にはこちらを使うことが推奨されていて、参照型はあまり使われることはないようです。
実行結果
>  let mutable b = "hello";;
val mutable b: string = "hello"

> b + " world";;
val it: string = "hello world"

> b <- "hi";;
val it: unit = ()

> b + " world";;
val it: string = "hi world"