清除功能方式以打破序列循环

Edw*_*rey 6 f# functional-programming break

我有一个带有可选退出条件的顺序进程.编写算法的一种方法是这样的

let mutable more = true
for slot = startSlot to endSlot do
    if more then
        more <- process()
Run Code Online (Sandbox Code Playgroud)

检查more由于退出而跳过的插槽的开销是微不足道的.尽管如此,似乎应该有一种更优雅的方式来表达这一点.

ild*_*arn 10

递归通常在这里:

let rec loop slot = if slot <= endSlot && process () then loop (slot + 1)
loop startSlot
Run Code Online (Sandbox Code Playgroud)

编译器会将其减少为一个简单的循环(不会发生实际的递归).

  • +1:尾递归是在F#中实现它的方式,它通常意味着你可以避免可变变量导致更多的惯用代码. (2认同)

kla*_*ske 5

这样做的一种方法是使用 Seq.takeWhile

seq{startSlot .. endSlot} 
|> Seq.takeWhile (fun _ -> process())
|> Seq.iter ignore
Run Code Online (Sandbox Code Playgroud)

这将在process()返回时退出循环false

  • `Seq`是懒惰的; 除非实际迭代序列,否则这不会做任何事情. (2认同)
  • 与尾递归相比,`seq`也非常慢 (2认同)