/ / OCaml während True Schleife - funktionale Programmierung, ocaml

OCaml während True Schleife - funktionale Programmierung, ocaml

Ich habe den folgenden Code:

let a = 1 in
while a<10 do
let a = a+1 in
done
Printf.printf "the number is now %dn" a

Der Dolmetscher beschwert sich über Zeile 4, was ist done und ich habe keine Ahnung, was hier falsch ist.
Ich verstehe, dass OCaml eine funktionale Sprache ist und die Variablen unveränderlich sind. Ich sollte nicht versuchen, den Wert von zu ändern a Hier. Aber trotzdem, da ist ein while true do .. done Schleife in OCaml. Ich hoffe, du verstehst, was ich hier versuche. Wie soll ich den Code für diesen Job ändern? while true do .. done?
Ich bin sehr neu in der funktionalen Programmierung. Bitte bringen Sie mir den richtigen Weg, um damit anzufangen. Ich stehe fest in der Sackgasse des Denkens.

Antworten:

8 für die Antwort № 1

Das Konstrukt let ... erwartet einen anderen Ausdruck. Sie können zum Beispiel den Wert () verwenden (was im Grunde nichts bedeutet)

Also der Code

let a = 1 in
while a<10 do
let a = a+1 in
()
done
Printf.printf "the number is now %dn" a

Es wird kompiliert. Aber es wird unbegrenzt endlos laufen, weil das a, das beim Start als 1 definiert ist, anders ist als das a, das als + 1 deklariert wird. Beide sind konstante unterschiedliche Werte in verschiedenen Bereichen, und eine Deklaration innerhalb des Körpers einer Weile ist auf dieses Vorkommen des Körpers beschränkt.

Sie können erhalten, was Sie wollen, indem Sie ein as mutable mit der ref-Funktion und ihren Handlern angeben:

let a = ref 1 in
while !a < 10 do
a := !a + 1
done
Printf.printf "the number is now %dn" !a

Beachten Sie, dass Sie alle Vorteile von FP verlieren, indem Sie eine while-Schleife und veränderbare Werte verwenden.

Um dies funktional zu tun, können Sie eine rekursive Funktion verwenden:

let rec f a =
if a < 10
then f (a+1)
else a
in
let a = f 1 in
Printf.printf "the number is now %dn" a

Dies ist die richtige Art und Weise, um den Job zu machen. Wenn Sie FP machen wollen, vermeiden Sie unbedingt eine While-Schleife.