レコードの型を宣言するときの注意。既存の型と同じフィールド名を使ってしまうと,先に宣言した型のフィールド名が使えなくなってしまう。たとえば前エントリの 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