Immutarray - 不変な配列型 -

F# の基本思想は関数型言語であり、データ型は出来るだけ immutable に設計することが(暗黙に)推奨されています。また、そのようなデータ型の比較演算(= 演算子や <> 演算子)は参照の比較ではなく中身の値を比較するように設計されます。

しかし、配列型はこの哲学に則っていません。

  • 配列は immutable ではなく、a.[0] <- 123 といったコードで配列の中身を書き換えることが可能です。
  • 配列の = 演算子による比較は参照の比較であり、中身の値による比較になりません。

このため、不変性を保証したいレコード型であっても、メンバーに配列が含まれていると次のように値の変更が可能となってしまいます。

type Hoge { Data : int[] } // 配列を含むレコード型
let a = { Data = [| 1; 2; 3; |] }   // 不変オブジェクトのつもりでも…
a.[0] <- 4  // このように値を変更できてしまう

これを解決するため、MoNo.FSharp.dll に不変性が保証された配列型 Immutarray<'a> が定義されています。MoNo.RAIL に定義されている多くのデータ型で、この Immutarray が利用されています。

Feature ‘a[] Immutarray<’a>
不変性 NG OK
比較 参照の比較 値の比較

上記の違い以外はほぼ配列と同等の機能が用意されています。 Immutarray モジュールも用意されており、組み込みの Array モジュールとほぼ同等の機能が用意されています。