Optionales Argument kann nicht gelöscht werden?

8

Ich wollte eine tail-rekursive Version von List.map haben, also habe ich meine eigene geschrieben. Hier ist es:

%Vor%

Immer wenn ich diese Funktion kompiliere, bekomme ich:

%Vor%

Im Tutorial heißt das, dass ich versuche, eine Funktion ohne nicht optionale Argumente zu erstellen. Aber die obige Funktion nimmt eindeutig nicht optionale Argumente.

Ich mache wahrscheinlich nur etwas wirklich dummes, aber was?

    
Jason Baker 03.11.2009, 13:05
quelle

3 Antworten

3

Die vorherigen Lösungen kompilieren, aber geben nicht das erwartete Ergebnis. Die Funktion f wird niemals auf die Argumente angewendet. Ein korrekter Code ist:

%Vor%

Der abgeleitete Typ ist:

%Vor%

... im Gegensatz zu dem falschen:

%Vor%

Bitte beachten Sie, dass die Ergebnisliste umgekehrt ist:

%Vor%

... und entspricht der Funktion rev_list aus dem List-Modul :

%Vor%

Vielleicht möchten Sie Ihre Funktion folgendermaßen ändern:

%Vor%

... welches ebenfalls (wie im Handbuch beschrieben) tail-rekursiv sein sollte und die Liste in der ursprünglichen Reihenfolge zurückgibt:

%Vor%     
simon04 02.12.2009, 12:33
quelle
14

Ja, Ihr nicht-optionales Argument kann nicht das letzte sein, denn da OCaml partielle Anwendungen unterstützt, wird eine Funktion, die ein letztes optionales Argument enthält, nur wie eine teilweise angewendete Funktion aussehen, die immer noch nach dem optionalen Argument sucht. Die einzige Möglichkeit zu sagen, dass Sie nicht beabsichtigen, das optionale Argument anzugeben, besteht darin, dass Sie sehen, dass Sie nach dem Argument ein Argument angegeben haben.

Wenn Sie es zuletzt haben müssen, können Sie ein dummy unit Argument danach einfügen:

%Vor%

Aber in diesem Fall wäre es ja besser, die Reihenfolge zu ändern.

    
newacct 03.11.2009 15:05
quelle
12

Sie benötigen ein nicht optionales Argument nach das optionale Argument. Ändern Sie einfach die Reihenfolge der Argumente Ihrer Funktion:

%Vor%     
Pascal Cuoq 03.11.2009 13:09
quelle