Ich habe eine Hausübung in Ocaml zu machen ...
Mein Lehrer sagte, dass wir diese zwei Typen verwenden müssen:
%Vor%Mein Problem ist, dass wenn ich ein Array erstelle:
%Vor%Ich weiß nicht, welche Werte in dieses Array eingefügt werden können ...
%Vor%Kann mir jemand sagen, welcher Wert in dieses Array eingefügt werden kann?
Solange Sie nichts zum Array hinzufügen, ist der Typ nicht vollständig definiert. Dies spiegelt sich in dem für das Array angegebenen Typ wider:
val a : '_a zapis array = [|Prazen; Prazen; Prazen; Prazen; Prazen|]
Wenn du genau hinsiehst, wirst du sehen, dass die 'a
, die du als Typparameter angegeben hast, zu '_a
geworden ist (beachte die _
). Dieser Typ bedeutet "irgendein Typ, aber ich weiß noch nicht welcher". Im Gegensatz zu 'a
, was irgendeinen Typ bedeutet.
Dies bedeutet, dass Sie an dieser Stelle jede Art von Zapis einfügen können. Sobald Sie das getan haben, können Sie nur Zapis dieses speziellen Typs einfügen (in weiteren Typen verschwindet '_a
und wird durch den korrekten Typ ersetzt).
Also, wenn du es tust
%Vor% a
wird int zapis array
und akzeptiert ab diesem Zeitpunkt nur noch Ints.
wenn Sie stattdessen
tun %Vor% wird zu einem string zapis array
akzeptiert nur Zeichenfolgen danach.
Können Sie mir sagen, wie Sie einen Array-Typ asocpolje erstellen?
'a asocpolje
und 'a zapis array
sind vom selben Typ . Abhängig davon, wie genau die Typer Ihre Definitionen ableiten, erhalten Sie das eine oder das andere, aber sie sind genau gleichwertig. 'a asocpolje
ist nur ein Alias für 'a zapis array
, kein neuer Typ.
Sie können OCaml dabei helfen, die richtigen Informationen mit einer expliziten Anmerkung zu drucken:
%Vor% Ich würde jedoch diese Praxis entmutigen . Es verhält sich in nicht naheliegender Weise (zB die Bedeutung von 'a
hier kann überraschend sein, es erzwingt keinen Polymorphismus) und du versuchst wirklich einen Unterschied zu machen, wo es nicht ist (die Typen sind gleich). Wenn Sie wirklich eine Unterscheidung zwischen beiden Typen wünschen, sollten Sie 'a asocpolje
als neuen algebraischen Typ (mit nur einem Fall) definieren: