TL;DR

名前付きの値(フィールド)をまとめた型。Domain Modeling Made Functional では、複数の型をすべて組み合わせる AND 型(直積型)として紹介されている。

なぜ必要か

関数型プログラミングでは、小さな型を合成して新しい型を作る。Domain Modeling Made Functional によると、F# の合成方法は AND 型のレコード型と、OR 型の判別共用体の 2 つである。この組み合わせを代数的な型システムと呼ぶ。

仕組み

F# のドキュメントによると、F# のレコードは名前付きの値を単純にまとめたもので、メンバーも持てる。値を作るときは、すべてのフィールドに値を渡す必要がある。

レコードはデフォルトでイミュータブルで、値を変えたいときは with を使ったコピーと更新の式で新しいレコードを作る。また、クラスが参照の等価性を持つのに対して、レコードは構造的な等価性を持つので、フィールドの値がすべて同じなら等しいとみなされる。

例

type Point = { X: float; Y: float; Z: float }
 
let p1 = { X = 1.0; Y = 1.0; Z = -1.0 }
let p2 = { p1 with Z = 0.0 } // コピーと更新の式

注意点

Domain Modeling Made Functional の第 7 章では、状態が変わるものを 1 つのレコード型とフラグで表すと、状態が暗黙的になり、ルールを強制できないとしている。状態ごとに型を分け、判別共用体でまとめるほうがよい。

関連

出典