Wrong explanation for the merge of the two records
The current explanation for the merge is not correct:
val merge : t -> t -> t
(** [merge t1 t2] discards the non record component of [t1] and [t2] and
returns the type of the [+] operators on records, that is, returns a record
type [t] where the type of label [l] is the one of [t2] if it is present in
[t2] and the type of [t1] otherwise.
*)
Actually, this does not cover when l is optional in t1. If this is the case then it is the union of the two types
Formally
(t1 + t2)[l] = (t1[l]\undef)|t2[l] for undef < t1[l]