■
あんまりOCamlの話ではないのですが。
先日のオブジェクトの話*1のコメントで、< name : string; .. > listがありえないという指摘をいただきましたが、そうではないと思います。これがだめなら、< name : string; .. > -> stringといった型もありえないことになるのではないでしょうか。
OCamlのオブジェクトが基づくRemyの多相型レコードと等しい*2 *3大堀流レコードでは、OCamlの< name : string; .. > listに対応する型は、∀t . { t :: {{ name : string }} } => t listなどと、コンストラクタの外側にオブジェクトであることを表現する制約(カインド)をつけて、表現します。higher-rankにはなりません。(Remyの形式は知らないのですが)
ただ、それにしても
# let f x = x#f 1;; val f : < f : int -> ’a; .. > -> ’a = <fun> # List.map f;; - : < f : int -> ’_a; _.. > list -> ’_a list = <fun>
などとしたときに、List.map fが単相型になるのは、理解できませんが。(< f : int -> 'a; .. > list -> 'a listになってほしい)