Wenn ich in OCaml eine Funktion schreiben muss, die viele if-then-else verwendet, dann ist unten meine dumme und hässliche Lösung.
%Vor%Wie verschönere ich den obigen Code? Ich mag C / C ++ & amp; Java-Stil, der "return" verwendet, um den Einzug der nächsten if-Anweisung zu speichern. Kann ich dasselbe mit OCaml machen?
%Vor% Die syntaktischen Konstrukte if
funktionieren in der Tat nicht in C und OCaml . In C sind if
Syntaxformen Anweisungen, in OCaml sind sie Ausdrücke. Der nächste, den Sie in C bis OCaml if
erhalten, ist der ternäre Operator ?:
. Wenn Sie versuchen, Ihren C-Code mit diesem Operator anstelle von if
neu zu schreiben, stehen Sie vor der gleichen Herausforderung. Das bedeutet jedoch nicht, dass es unmöglich ist, da andere Antworten Lösungen bieten.
Der einfachste, der in beiden Sprachen funktioniert, besteht darin, den Funktionskörper in mehrere Unterfunktionen (*) zu zerlegen und Fortsetzungen zu verwenden:
%Vor%Beim Schreiben von Objektmethoden kann es immer noch ein wenig mühsam sein, aber Sie können immer innere Funktionen verwenden, um das "Einrückungsgleichgewicht" innerhalb des Methodenbereichs wiederherzustellen.
Beachten Sie auch, dass das Schlüsselwort rec
nur dazu dient, jeder Fortsetzung zu erlauben, ihrem Aufrufer im Quelllayout zu folgen, es gibt hier keine echte Rekursion.
(*): @gsg hat es auch in den Kommentaren erwähnt.
In OCaml gibt es keine return
-Anweisung, obwohl Sie eine mit Hilfe von Ausnahmen emulieren können:
Eine andere hilfreiche Lösung wäre eine faule Auswertung:
%Vor%Dies ist eines der Beispiele, die faule verwenden, es gibt wahrscheinlich eine prägnantere Art, Ihre Berechnung auszudrücken.
Die Core-Bibliothek enthält eine with_return
-Funktion, mit der Sie eine nicht-lokale exists-Funktion ausführen können:
Aber im Allgemeinen ist es besser, den Mustervergleich zu verwenden oder den Code zu überdenken. Wenn Sie beispielsweise eine Liste von Prädikaten haben und je nachdem, welches Prädikat wahr ist, einen Wert zurückgeben möchten, können Sie dies in einer Zuordnungsstruktur als Suche kodieren:
%Vor%Natürlich haben Sie in diesem Fall keine Kurzschlussauswertung. Sie können dies mit fauler Bewertung oder mit Thunks beheben. Aber wenn Ihre Berechnungen nicht wirklich schwer sind oder Nebenwirkungen verursachen, ist es das nicht wert.
Im Gegensatz zu if
-Ausdrücke erstrecken sich match
-Klauseln bis zum Ende der Funktion, auch wenn sie mehrere Anweisungen enthalten, ohne Klammern zu benötigen. So können Sie tun:
Sie haben nicht gezeigt, woher result1
in Ihrem Beispiel kommt, also kann ich nicht sicher sein, aber Sie finden es vielleicht besser, wenn ...
eine Option mit dem Ergebnis zurückgibt, als eine bool, z
Tags und Links if-statement ocaml