Wenn Sie den imperativen Stil beibehalten möchten, können Sie eine Schleife mit einer Ausnahme beenden:
%Vor%Aber im Allgemeinen, wie bereits geschrieben wurde, ist in OCaml der funktionale Stil vorzuziehen:
%Vor%In diesem Beispiel gibt es keinen großen Unterschied zwischen den beiden Versionen, aber die Verwendung von Ausnahmen für das Beenden von Schleifen / Rekursionen muss mit Vorsicht verwendet werden; Sie können Kontrollfluss Bugs ziemlich leicht mit ihnen einführen, und sie sind manchmal schwer zu debuggen.
Übrigens können Sie den Array.unsafe_get -Haufen verwenden, um Ihren Array-Zugriff zu beschleunigen, da Sie sicher sein können, dass i immer im gültigen Bereich des Arrays ist, wie in den obigen Beispielen. (Oh, wir müssen aber auch anfangen & gt; = 0 überprüfen.)
Asumu Takikawa hat Recht, die for
-Schleife in OCaml gibt kein Ergebnis zurück. In idiomatischen OCaml sollten Sie stattdessen Rekursion verwenden. Idealerweise würde es eine Standardfunktion wie List.find
geben, die für Arrays funktioniert. Es gibt eine Funktion BatArray.findi
in OCaml Batterien enthalten das tut, was Sie scheinen zu wollen.
Einfacher und effizienter (keine Zuweisung):
%Vor%Oder im imperativen Stil:
%Vor% (Beachten Sie, dass raise exit
nicht nur wegen der Ausnahme reserviert, wenn sie vorberechnet ist).
Schleifen in Ocaml sollten zwingend sein, daher sollte es (außer der Einheit) kein Ergebnis liefern. Wenn Sie also versuchen, ein Ergebnis zurückzugeben, das keine Einheit ist, gibt der Compiler eine Warnung aus.
Der Grund, warum Ocaml nicht zulässt, dass Sie ein Ergebnis aus einer Schleife zurückgeben, ist, dass dies kein sehr funktionales Idiom ist. Wenn Sie eine rekursive Funktion anstelle einer Schleife verwenden, ist es einfach, früh zu beenden und ein Ergebnis zurückzugeben (indem Sie das Ergebnis anstelle von wiederkehrend zurückgeben). Wenn Sie idiomatische Ocaml schreiben möchten, möchten Sie in diesem Fall wahrscheinlich Rekursion verwenden.
Tags und Links functional-programming ocaml