2013-05-14 184 views

回答

23

簡短的答案是否定的。您通常會使用一些高階函數來表達相同的功能。有許多功能可以讓你做到這一點,對應不同的模式(所以如果你描述了你需要什麼,有人可能會給你一個更好的答案)。

例如,tryFind函數返回從一個給定的謂詞返回true序列,它可以讓你寫這樣的事情的第一個值:

seq { 0 .. 100 } |> Seq.tryFind (fun i -> 
    printfn "%d" i 
    i=66) 

在實踐中,這是去,如果最好的方式你正在表達一些高級邏輯,並有一個相應的功能。如果你真的需要表達的東西像break,你可以使用一個遞歸函數:

let rec loop n = 
    if n < 66 then 
    printfn "%d" n 
    loop (n + 1) 

loop 0  

更奇特的選項(也就是效率不高,但可能是DSL的很好)是可以定義計算表達式可讓您編寫breakcontinueHere is an example,但正如我所說,這不是有效的。

4

您必須將其更改爲while循環。

let (i, ans) = (ref 0, ref -1) 
while(!i < 100 and !ans < 0) do 
if !i = 66 then 
    ans := !i 
ans 

(這打破了,當我到達66 - 但是,是的語法是完全不同的,另一個變量的引入,等等)

+1

而且由於它不增加'我',它需要很長時間。 :-) – 2017-02-20 14:28:48

2

這實在是太醜了,但對我來說它的工作。

let mutable Break = false 
while not Break do 
    //doStuff 

    if breakCondition then 
     Break <- true 
done 

這對於do-while循環非常有用,因爲它確保循環至少執行一次。

我希望有一個更優雅的解決方案。我不喜歡遞歸的,因爲我害怕堆棧溢出。 :-(

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

對於此類問題,你可以使用一個遞歸函數

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

試試這個:

exception BreakException 

try 
    for i = 0 to 99 do 
     if i = 66 then 
     raise BreakException 
with BreakException ->() 

我知道有些人不喜歡用但它有優點

  • 你不必考慮複雜的遞歸函數。 因爲你可以做到這一點,但有時它不必要地麻煩 和使用異常更簡單。

  • 此方法允許您在循環體的中途斷開。 (中斷「標誌」方法也很簡單,但它只允許在循環體的末尾中斷)。

  • 您可以輕鬆地從嵌套循環中轉義。