レコードのフィールド名は重ならないように

レコードの型を宣言するときの注意。既存の型と同じフィールド名を使ってしまうと,先に宣言した型のフィールド名が使えなくなってしまう。たとえば前エントリの student とその値が存在している状態で:

 # type student = {name : string; id : int};;
 type student = { name : string; id : int; }
 # let st1 = {name = "Taro"; id = 123};;
 val st1 : student = {name = "Taro"; id = 123}
 # let st2 = {id = 51; name = "Ichiro"};;
 val st2 : student = {name = "Ichiro"; id = 51}

新しいレコードの型を宣言する。フィールド名 name が重なっている。

 # type foo = {name : bool};;
 type foo = { name : bool; }

すると,name は foo のフィールド名としては使えるけど,student のフィールド名としては使えなくなってしまう。

 # let f1 = {name = true};;
 val f1 : foo = {name = true}
 # let st4 = {name = "Daisuke"; id = 16};;
 Characters 18-27:
   let st4 = {name = "Daisuke"; id = 16};;
                     ^^^^^^^^^
 This expression has type string but is here used with type bool

アクセスもできない。

 # st2.name;;
 Characters 0-3:
   st2.name;;
   ^^^
 This expression has type student but is here used with type foo

f1 のフィールドにはアクセスできる。

 # f1.name;;
 - : bool = true