2013-05-14 10 views

Antwort

23

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.

4

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

+1

Und da es 'i' nicht erhöht, dauert es sehr lange. :-) –

2

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. :-(

0
seq { 
    for i = 0 to 99 do 
     if i = 66 then yield() 
} 
|> Seq.tryItem 0 
|> ignore 
0

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 
0

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.