7.8 プライベート型 (Private types)

     type-representation ::=  ...                                        
                          |   = private constr-decl  { | constr-decl }   
                          |   = private { field-decl  { ; field-decl } } 

プライベート型は バリアント型か レコード型です。 これらの値は パターンマッチ や レコードアクセスのための expr . field 構文 によって分解できます。 しかしながら、 これらの型の値は 構築子(FIXME:constrcutor)の適用や レコード構築では 構築できません。 さらに、 プライベートなレコード型のミュータブル (FIXME:mutable) なフィールドへの代入は 許可されません。

プライベート型の典型的な 使用法は、モジュールのエクスポートシグネチャ (FIXME) において、 プライベート型の値が モジュールで提供される関数を経由することを保証する一方、 定義しているのモジュールの外で パターンマッチングを許可する場合です。 例えば:

        module M : sig
                     type t = private A | B of int
                     val a : t
                     val b : int -> t
                   end
                 = struct
                     type t = A | B of int
                     let a = A
                     let b n = assert (n > 0); B n
                   end

ここで、 プライベート宣言は 型 M.t のどんな値も コンストラクタ B の引数が 正の整数になることを保証します。

パラメータの variance (FIXME:可変性?) については、 プライベート型は抽象型(FIXME) と同様に 扱われます。 つまり、 もしプライベート型がパラメータを持つ場合、その variance は プレフィクス '+' か '-' を付けることで 陽に 与えるか、さもなくば invariant (FIXME:不変とか) になります。 With respect to the variance of their parameters, private types are handled like abstract types. That is, if a private type has parameters, their variance is the one explicitly given by prefixing the parameter by a `+' or a `-', it is invariant otherwise.