7.10 プライベート 列型 (Private row types)

(FIXME:節タイトル↑の訳)

                     type-equation ::=  ...               
                                    |   = private typexpr 

プライベート列型 (FIXME) は型の構造の一部分が抽象的になるような型の略記です。 具体的には、 上の typexpr はオブジェクト型か 多相バリアント型で、refinement (FIXME:訳) の余地がなければなりません。 もしプライベート宣言がインタフェースで用いられた場合、対応する実装は グラウンドなインスタンスか、refineされたプライベート型を提供します。

   module M : sig type c = private < x : int; .. > val o : c end =
     struct
       class c = object method x = 3 method y = 2 end
       let o = new c
     end

この宣言は y メソッドを隠し、 さらに他の閉じたオブジェクト型と型 c を非互換にします。これは o だけが c 型をもつことを意味します。 この側面において これはプライベートなレコード型と同様に振る舞います。 しかしプライベート列型はインクリメンタルな refinement (FIXME) についてより柔軟です。 この機能は ファンクタとの組み合わせでも使えます。

   module F(X : sig type c = private < x : int; .. > end) =
     struct
       let get_x (o : X.c) = o#x
     end
   module G(X : sig type c = private < x : int; y : int; .. > end) =
     struct
       include F(X)
       let get_y (o : X.c) = o#y
     end

多相バリアントは 新しい構築子(FIXME:constructor)を追加するか、宣言された構築子の disparition (FIXME:訳) を認めるかの 2通りの方法で refine できます。 2番目のケースは プライベートバリアント型 (プライベート型の値を構築できない) に対応し、 一方1番目のケースは パターンマッチにおいて追加のコンストラクタを扱うためのデフォルトケース (FIXME:default case) を要求します。 (訳注:すべてモジュールの外部での話です。もちろんモジュール内部では private は無視できます)

   type t = [ `A of int | `B of bool ]
   type u = private [< t > `A ]
   type v = private [> t ]

型 u では、(`A n) の形で値を作ることができますが (`B b) はできません。 型 v では、 値の構築は制限されませんが、パターンマッチはデフォルトケースを持つ必要があります。

抽象型 (FIXME:abstract type) や プライベート型 と似て、 型パラメータの variance (FIXME:訳) は推論されず、陽に与えなければなりません。