定義すると
type foo = int
type bar = Leaf | Node of int * int
foo
は、既存の型の型シノニム( int
) とbar
、新しい型を導入し、新しいコンストラクターLeaf
を導入すると の間には基本的な違いがありNode
、以前のものとは異なります。
あなたが書くとき
module M = struct
type foo = int
type bar = Leaf | Node of int * int
end
型M.foo
は と等しいint
が、型M.bar
はそれ自体とのみ等しい: それは新しく、比較するものは何も存在しない (まったく同じコンストラクターを持つ型でさえ、異なっていて互換性がないと見なされる)。
署名で公開することは理にかなっていますが、 :はそれ自体と等しいだけであるとはM.foo = int
言いませんが、署名の改良では何の情報も得られません。M.bar = Leaf | ...
M.bar
M.bar
M with type bar = M.bar
tGraphe
コードの問題は、抽象型を使用する署名への帰属を使用することを主張していることです。jrouquie のコードを書いても何も得られない
type global_arc = Vide | Node of (int*int)
module Two : tGraphe with type noeud = int and type arc = global_arc = struct
type noeud = int
type arc = global_arc
end;;
単にではなく
module Two = struct
type noeud = int
type arc = Vide |Node of(int*int)
end
施工M : S
はチェックだけではありません。からの入力情報を積極的に非表示M
にします。建設S with type ... = ...
は、あなたがそうするよりも少し隠すことを可能にするためにそこにありますS
. しかし、あなたの例では、何も隠したくない場合は、署名の帰属を使用しないでください! ただ書いてmodule M = struct ... end
ください。
: S
間違っていないこと、フィールド名などに間違いがないことを確認するためだけに使用する場合は、純粋なチェックとして側面で使用できます。
module Two = struct ... end
let () = ignore (module Two : S) (* only a check! *)
SML には、互換性のみをチェックする「透明な」モジュール アノテーションと、互換性を強制して型情報を隠す「不透明な」モジュール アノテーション (一般にsealと呼ばれる) が区別されます。OCaml には不透明なシールしかないので、使いすぎないように注意する必要があります。
PS: StackOverflow で質問する場合は、フランス語よりも英語でコードを記述した方がよいでしょう。