3

OCaml でレコード型を強制できないのはなぜですか? のような基本型は正常にint動作します。

M以下は、 moduleに含める基本モジュールを構築する例ですAM.tは で省略されたタイプですAM.tある限りint、私はできますA.t' :> M.t。に変更すると{i : int}、コンパイラはサブタイプではないと言います。これには非常に具体的な理由があると思いますか?

module M = struct
  type t = {i : int}
  let make () = {i = 10}
end

module A : sig
  include module type of M
  type t' = private t
  val make : unit -> t'
end = struct
  include M
  type t' = t
end

トップレベルで:

(A.make() :> M.t);;
Error: Type A.t' is not a subtype of M.t 
4

1 に答える 1

3

これA.t'は、 とは関係がなくM.t、 は等価性を「保持」しないためinclude、モジュール構造 (または署名) を文字通り複製し、その場所に (新しい型と値として) インライン化するだけです。そのため、型M.tには関係がなくA.t、したがってA.t'(また、異なるレコード型には、オブジェクトやモジュールのように定義された構造的なサブタイピングがありません)。明らかな修正はtype t' = private M.t.

アップデート

の代わりにの内容をコピーペーストするのとは異なり、type t' = private M.t署名とinclude M type t' = t実装では型チェックを行うためinclude M、 は等価性を保持するため (そうでなければ署名と一致できません) 、上記は完全には正しくないようです。しかし、これは「明らかに」新しいタイプを作成するものには当てはまりません..type t' = private M.tMinclude Minclude module type of

于 2013-07-10T01:51:30.883 に答える