Schreibe ziemlich vielschichtigen verschachtelten if-then-else-Code in OCaml?

8

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%     
Trung Ta 14.02.2015, 12:36
quelle

4 Antworten

3

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.

    
didierc 14.02.2015, 16:59
quelle
5

In OCaml gibt es keine return -Anweisung, obwohl Sie eine mit Hilfe von Ausnahmen emulieren können:

%Vor%

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.

    
PatJ 14.02.2015 15:27
quelle
5

Die Core-Bibliothek enthält eine with_return -Funktion, mit der Sie eine nicht-lokale exists-Funktion ausführen können:

%Vor%

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.

    
ivg 14.02.2015 15:47
quelle
0

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:

%Vor%

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

%Vor%     
Thomas Leonard 16.02.2015 15:10
quelle

Tags und Links