私はあなたがこれをすることはできないが、なぜ正確に理解したいのか理解しています。中Refセルを使用した動的バインディング
module M : sig
type 'a t
val call : 'a t -> 'a option
end = struct
type 'a t
let state : ('a t -> 'a option) ref = ref (fun _ -> None)
let call : ('a t -> 'a option) = fun x -> !state x
end
結果:
Error: Signature mismatch:
Modules do not match:
sig
type 'a t
val state : ('_a t -> '_a option) ref
val call : '_a t -> '_a option
end
is not included in
sig
type 'a t
val call : 'a t -> 'a option
end
Values do not match:
val call : '_a t -> '_a option
is not included in
val call : 'a t -> 'a option
はなぜ抽象型は、ここでは互換性がありませんか?
私の腸は、早い対遅い拘束とは関係がありますが、タイプシステムがここで何をしているのか正確な説明を探しています。
ああ:
次のコードは、参照の代わりに
lfrec
を使用して私のためにコンパイル:通常の方法では、レコード・タイプを使用することですモノラルタイプ。ありがとうございました。また、論文へのリンクもありがとう。 –私はあなたがランク2の多型を使用して必要な動作を得ることができると思います。更新を参照してください。 –
私は作業しているものに['a' b.'の文字を追加しました([およびいくつかの余分な関数の注釈](https://stackoverflow.com/questions/40574396/ocaml-polymorphic-records-一般的ではないタイプ))と作業日数を保存しました。ありがとうございました! –