打破序列循环的简洁功能方法

Clean functional way to break out of a sequence loop

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

let mutable more = true
for slot = startSlot to endSlot do
    if more then
        more <- process()

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

一种方法是使用 Seq.takeWhile

seq{startSlot .. endSlot} 
|> Seq.takeWhile (fun _ -> process())
|> Seq.iter ignore

这将在process() returns false

时退出循环

递归在这里很常见:

let rec loop slot = if slot <= endSlot && process () then loop (slot + 1)
loop startSlot

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