New notations for record expressions

このページは最後に更新されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

last mod. 2010-08-05 (木) 15:46:00

OCaml 3.12 で導入されたレコード式の新たな記法を使うと、レコードのフィールド名とそこに設定したい値に束縛されている変数の名前が同じであるとき、「= 変数名」を省略できます。

すなわち、 3.11 以前では

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

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

と書いていたのを、 3.12 では次のように書くことができるようになりました。

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

フィールド名が修飾名である場合には、そのパス部分を除いた名前と変数名が同じ場合にも「= 変数名」の部分を省略することができます。

let re = 1.0 in
let im = 2.0 in
  { Complex.re; Complex.im }

この記法はパターン部分でも使うことができます。

let f { Complex.re; Complex.im } = (re, im)

もうひとつレコードに関する変更点として、 ocamlc などの -w オプションに R フラグを指定した場合に、レコードパターンですべてのフィールドが列挙されていない場合に警告が表示されるようになりました。

let real_part { Complex.re } = re (* ocaml -w R のときは警告が表示される *)

パターン部に「; _」を追加して、フィールドの欠けが意図的なものであることを明示すればこの警告は表示されません。

let real_part { Complex.re; _ } = re

新規 編集 添付