F#从while循环中断

che*_*zer 18 f# break while-loop

有什么方法可以做到这一点C/C#

例如(C#风格)

for( int i=0; i<100; i++)
{
   if(i==66)
    break;
} 
Run Code Online (Sandbox Code Playgroud)

Tom*_*cek 30

最简洁的答案是不.您通常会使用某些高阶函数来表达相同的功能.有许多功能可以让你这样做,对应不同的模式(所以如果你描述你需要什么,有人可能会给你一个更好的答案).

例如,tryFind函数返回给定谓词返回的序列中的第一个值true,这样可以编写如下内容:

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

实际上,如果你表达一些高级逻辑并且有相应的功能,这是最好的方法.如果你真的需要表达类似的东西break,你可以使用递归函数:

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

loop 0      
Run Code Online (Sandbox Code Playgroud)

一个更奇特的选择(效率不高,但可能对DSL很好)是你可以定义一个允许你写break和的计算表达式continue.这是一个例子,但正如我所说,这不是那么有效.


itm*_*kel 6

这确实很丑,但以我为例。

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

    if breakCondition then
        Break <- true
done
Run Code Online (Sandbox Code Playgroud)

这对于do-while循环很有用,因为它可以确保循环至少执行一次。

我希望有一个更优雅的解决方案。我不喜欢递归代码,因为我担心堆栈溢出。:-(


小智 5

您必须将其更改为while循环。

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

(这在我达到66岁时就中断了-但是是的,语法完全不同,引入了另一个变量,等等。)

  • 而且由于它不会增加`i`,因此需要花费很长时间。:-) (4认同)