循环在F#中的计算表达式?
  如果您定义了构建器对象的While方法,则可以在计算表达式中使用while循环。  While方法的签名是: 
member b.While (predicate:unit->bool, body:M<'a>) : M<'a>
  为了比较, For方法的签名是: 
member b.For (items:seq<'a>, body:unit->M<'a>) : M<'a>
  你应该注意到,在While方法中,body是一个简单的类型,而不是For方法中的函数。 
  您可以在计算表达式中嵌入一些其他语句,如let和function-calls,但这些语句不可能在while一次while -loop中执行。 
builder {
    while foo() do
      printfn "step"
      yield bar()
}
  为什么while -loop不会执行一次以上,而只是重复执行?  为什么与for-loops有显着区别?  更好的是,在计算表达式中使用while循环是否有一些预期的策略? 
如果你看看如何评估计算表达式,你会看到
while foo() do
  printfn "step"
  yield bar()
被翻译成类似的东西
builder.While(fun () -> foo(), 
              builder.Delay(fun () -> 
                              printfn "step"
                              builder.Yield(bar()))))
  该翻译允许多次评估while循环的主体。  尽管您的类型签名对于某些计算表达式(例如seq或async )是准确的,但请注意将调用插入到Delay可能会导致不同的签名。  例如,你可以像这样定义一个列表生成器: 
type ListBuilder() =
  member x.Delay f = f
  member x.While(f, l) = if f() then l() @ (x.While(f, l)) else []
  member x.Yield(i) = [i]
  member x.Combine(l1,l2) = l1 @ l2()
  member x.Zero() = []
  member x.Run f = f()
let list = ListBuilder()
现在您可以评估如下表达式:
list {
  let x = ref 0
  while !x < 10 do
    yield !x
    x := !x + 1
}
  得到[0 .. 9]的等价物。 
  在这里,我们的While方法具有签名(unit -> bool) * (unit -> 'a list) -> 'a list ,而不是(unit -> bool) * 'a list -> 'a list 。  通常,当Delay操作的类型为(unit -> M<'a>) -> D<M<'a>> , While方法的签名将是(unit -> bool) * D<M<'a>> -> M<'a> 。 
