Ich wollte eine tail-rekursive Version von List.map
haben, also habe ich meine eigene geschrieben. Hier ist es:
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?
Die vorherigen Lösungen kompilieren, aber geben nicht das erwartete Ergebnis. Die Funktion f
wird niemals auf die Argumente angewendet. Ein korrekter Code ist:
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%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:
Aber in diesem Fall wäre es ja besser, die Reihenfolge zu ändern.
Sie benötigen ein nicht optionales Argument nach das optionale Argument. Ändern Sie einfach die Reihenfolge der Argumente Ihrer Funktion:
%Vor%Tags und Links compiler-warnings ocaml optional-arguments