2013-05-14 135 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 ->() 

我知道有些人不喜欢用但它有优点

  • 你不必考虑复杂的递归函数。 因为你可以做到这一点,但有时它不必要地麻烦 和使用异常更简单。

  • 此方法允许您在循环体的中途断开。 (中断“标志”方法也很简单,但它只允许在循环体的末尾中断)。

  • 您可以轻松地从嵌套循环中转义。