あんまり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になってほしい)