Ich verstehe, dass Sie dies nicht tun können, aber genau warum verstehen wollen.Dynamische Bindung mit einer Ref-Zelle
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
Ergebnisse in:
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
Warum sind die abstrakten Typen hier nicht kompatibel?
Mein Bauchgefühl sagt mir, dass es alles mit der frühen vs späten Bindung zu tun hat, aber ich suche nach einer genauen Beschreibung dessen, was das Typsystem hier macht.
Ah, wusste nicht, dass ' '_a' bedeutet, dass es ein monophoner Typ. Vielen Dank. Und danke auch für einen Link zu der Zeitung. –
Ich denke, dass Sie das gewünschte Verhalten mit Rang 2 Polymorphismus erhalten können. Siehe Aktualisierung. –
Ich habe gerade die Buchstaben ''a'b' zu dem hinzugefügt, woran ich gearbeitet habe ([und einige zusätzliche Funktionsanmerkungen] (https://stackoverflow.com/questions/40574396/ocaml-polymorphic-records- type-is-less-general)) und erspart Arbeitstage. Vielen Dank! –