打破序列循环的简洁功能方法
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
编译器会将其简化为一个简单的循环(不会发生 实际 递归)。
我有一个带有可选退出条件的顺序过程。一种编写算法的方法是这样的
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
编译器会将其简化为一个简单的循环(不会发生 实际 递归)。