ここで理解しておくべき重要なことは、OCaml は構成的な方法で型推論を実行するということです。つまり、最初に の型を推論し、struct ... end
次に推論された型sig ... end
を照合して、構造が実際に署名を実装しているかどうかを検証します。
たとえば、次のように書くと
module Monkey : sig val f : int -> int end =
struct
let f x = x
end
OCaml は、必要な型に特化できるf
多相型を持っていることがわかるので、満足します。は不透明にするため、つまりシグネチャは実装を隠すため、実際の実装には多相型があっても、それが typeであることがわかります。'a -> 'a
int -> int
sig ... end
Monkey
f
int -> int
あなたの特定のケースでは、OCaml は最初g
に type を持っていると推測し'a -> 'a
、次に type も同様であるとh
推測'a -> 'a
します。したがって、構造体には型があると結論付けられます
sig val g : 'a -> 'a val h : 'a -> 'a end
次に、署名が指定されたものと照合されます。型の関数は'a -> 'a
特殊化できるためint -> int
、string -> string
OCaml はすべてがうまくいっていると結論付けます。もちろん、使用の要点はsig ... end
、構造を不透明にする (実装を非表示にする) ことです。これが、トップレベルがandのポリモーフィック型を公開しない理由です。g
h
OCaml がどのように機能するかを示す別の例を次に示します。
module Cow =
struct
let f x = x
let g x = f [x]
let a = f "hi"
end
module Bull : sig
val f : int -> int
val g : 'b * 'c -> ('b * 'c) list
val a : string
end = Cow
レスポンスは
module Cow :
sig
val f : 'a -> 'a
val g : 'a -> 'a list
val a : string
end
module Bull :
sig
val f : int -> int
val g : 'a * 'b -> ('a * 'b) list
val a : string end
end