Wie gebe ich den Index einer for-Schleife in OCaml zurück?

8
%Vor%

Wie kann ich den Index einer Schleife als Integer zurückgeben, nachdem die Übereinstimmung gefunden wurde?

    
Takkun 27.02.2012, 01:00
quelle

4 Antworten

8

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.)

    
camlspotter 27.02.2012, 05:16
quelle
5

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.

    
Jeffrey Scofield 27.02.2012 01:49
quelle
5

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).

    
Fabrice Le Fessant 27.02.2012 13:07
quelle
4

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.

    
Asumu Takikawa 27.02.2012 01:10
quelle

Tags und Links