Array eines Typs mit einem Parameter in Ocaml

8

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?

    
Cevap 01.06.2011, 08:36
quelle

2 Antworten

11

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.

    
LiKao 01.06.2011, 09:00
quelle
5
  

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:

%Vor%     
gasche 01.06.2011 10:01
quelle

Tags und Links