7.11 レコードの記法

(OCaml 3.12 〜)

pattern ::= ...
| { field [ = pattern ] { ; [ field = pattern ] } [ ; _ ] }
expr ::= ...
| { field [ = expr ] { ; field [ = expr ] } }
| { expr with field [ = expr ] { ; field [ = expr ] } }

レコードパターンやレコードを新たに構成する式で、単一の識別子 idid = id を意味し、 修飾子付き識別子 path.idpath.id = id を意味します。例えば次のようなレコード型が宣言されているとします。

type point = { x: float; y: float }

すると次の式はすべて等価です。

let x = 1 and y = 2 in { x = x; y = y }
let x = 1 and y = 2 in { x; y }
let x = 1 and y = 2 in { x = x; y }
    

同様に、次のふたつの関数も等価です。

fun {x = x; y = y} -> x + y
fun {x; y} -> x + y
    

また、レコードパターンを ; _ を終えることで、パターン中にレコードのフィールドがすべては列挙されていず、また、それが意図通りであることを表すことができます。デフォルトではコンパイラは ; _ を無視しますが、 ; _ で終端することで、 -w オプションの R フラグがオンになっているとき、レコードパターンで対応するレコード型のフィールドをすべて列挙していないと表示される警告を表示しないようにできます。上の point の例で、 R フラグがオンになっていると

fun {x} -> x + 1

は警告を表示しますが、

fun {x; _} -> x + 1

は警告を表示しません。この警告は、レコード型に新たなフィールドを追加したときに、修正すべきパターンを見つけるのに役立ちます。