我有一個可選退出條件的順序過程。寫算法的一種方法是這樣的乾淨的功能方式打破序列循環
let mutable more = true
for slot = startSlot to endSlot do
if more then
more <- process()
檢查more
對那些由於出口是微不足道跳過槽的開銷。儘管如此,似乎應該有一個更優雅的方式來表達這一點。
我有一個可選退出條件的順序過程。寫算法的一種方法是這樣的乾淨的功能方式打破序列循環
let mutable more = true
for slot = startSlot to endSlot do
if more then
more <- process()
檢查more
對那些由於出口是微不足道跳過槽的開銷。儘管如此,似乎應該有一個更優雅的方式來表達這一點。
遞歸是平常這裏:
let rec loop slot = if slot <= endSlot && process() then loop (slot + 1)
loop startSlot
編譯器將減少這到一個簡單的循環(沒有實際遞歸發生)。
這樣做將是一個方法使用Seq.takeWhile
seq{startSlot .. endSlot}
|> Seq.takeWhile (fun _ -> process())
|> Seq.iter ignore
這將退出循環時process()
回報false
'Seq'懶惰;除非序列被實際迭代,否則這將不會執行任何操作。 – ildjarn
哎呀,你是對的,編輯答案 – klasske
另外'seq'與尾遞歸相比非常慢/對於 – FuleSnabel
+1:尾遞歸是在F#中完成它的方式,它也常常意味着你可以避免可變變量導致更多的慣用代碼。 – FuleSnabel