Gibt es eine Möglichkeit, es wie C/C#
zu tun?F # Pause von While-Schleife
Zum Beispiel (C# Stil)
for(int i=0; i<100; i++)
{
if(i==66)
break;
}
Gibt es eine Möglichkeit, es wie C/C#
zu tun?F # Pause von While-Schleife
Zum Beispiel (C# Stil)
for(int i=0; i<100; i++)
{
if(i==66)
break;
}
Die kurze Antwort ist nein. Sie würden in der Regel eine Funktion höherer Ordnung verwenden, um die gleiche Funktionalität auszudrücken. Es gibt eine Reihe von Funktionen, mit denen Sie dies tun können, die verschiedenen Mustern entsprechen (wenn Sie also beschreiben, was genau Sie brauchen, kann Ihnen jemand eine bessere Antwort geben).
Zum Beispiel tryFind
Funktion gibt den ersten Wert aus einer Sequenz, für die ein bestimmtes Prädikat true
zurückgibt, die Sie so etwas schreiben kann:
seq { 0 .. 100 } |> Seq.tryFind (fun i ->
printfn "%d" i
i=66)
In der Praxis ist dies der beste Weg, wenn zu gehen Sie drücken eine Logik auf hoher Ebene aus, und es gibt eine entsprechende Funktion. Wenn Sie wirklich so etwas wie break
auszudrücken, dann können Sie eine rekursive Funktion verwenden:
let rec loop n =
if n < 66 then
printfn "%d" n
loop (n + 1)
loop 0
Eine exotische Option (das ist nicht so effizient, kann aber für DSLs schön sein) ist, dass Sie einen Berechnungsausdruck definieren Damit können Sie break
und continue
schreiben. Here is an example, aber wie gesagt, das ist nicht so effizient.
Sie müssen es in eine While-Schleife ändern.
let (i, ans) = (ref 0, ref -1)
while(!i < 100 and !ans < 0) do
if !i = 66 then
ans := !i
ans
(Dies bricht, wenn ich bis 66 bekommt - aber ja die Syntax ist ganz anders, eine andere Variable eingeführt wird, etc.)
Das ist wirklich hässlich, aber in meinem Fall hat es funktioniert.
Dies ist nützlich für Do-While-Schleifen, weil es garantiert, dass die Schleife mindestens einmal ausgeführt wird.
Ich hoffe, es gibt eine elegantere Lösung. Ich mag den rekursiven nicht, weil ich Angst vor Stapelüberläufen habe. :-(
seq {
for i = 0 to 99 do
if i = 66 then yield()
}
|> Seq.tryItem 0
|> ignore
Für diese Art von Problemen können Sie eine rekursive Funktion verwenden
let rec IfEqualsNumber start finish num =
if start = finish then false
elif
start = num then true
else
let start2 = start + 1
IfEqualsNumber start2 finish num
Versuchen Sie folgendes:.
exception BreakException
try
for i = 0 to 99 do
if i = 66 then
raise BreakException
with BreakException ->()
Ich weiß, dass einige Leute nicht gerne verwenden Ausnahmen. Aber es hat Vorteile.
Sie muss nicht über komplizierte rekursive Funktionen nachdenken. Von Ursache können Sie das tun, aber manchmal ist es unnötig lästig und die Verwendung von Ausnahme ist einfacher.
Diese Methode ermöglicht es Ihnen, auf halber Strecke des Schleifenkörpers zu brechen. (Break "Flag" -Methode ist auch einfach, aber es erlaubt nur am Ende der Schleife Körper zu brechen.)
Sie können leicht aus der verschachtelten Schleife entkommen.
Und da es 'i' nicht erhöht, dauert es sehr lange. :-) –