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)
编译器会将其减少为一个简单的循环(不会发生实际的递归).
这样做的一种方法是使用 Seq.takeWhile
seq{startSlot .. endSlot}
|> Seq.takeWhile (fun _ -> process())
|> Seq.iter ignore
Run Code Online (Sandbox Code Playgroud)
这将在process()返回时退出循环false