参照型
参照型を使えば、値を変更可能(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"