2017-02-20 60 views
5

我有一個可選退出條件的順序過程。寫算法的一種方法是這樣的乾淨的功能方式打破序列循環

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

檢查more對那些由於出口是微不足道跳過槽的開銷。儘管如此,似乎應該有一個更優雅的方式來表達這一點。

回答

9

遞歸是平常這裏:

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

編譯器將減少這到一個簡單的循環(沒有實際遞歸發生)。

+2

+1:尾遞歸是在F#中完成它的方式,它也常常意味着你可以避免可變變量導致更多的慣用代碼。 – FuleSnabel

4

這樣做將是一個方法使用Seq.takeWhile

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

這將退出循環時process()回報false

+2

'Seq'懶惰;除非序列被實際迭代,否則這將不會執行任何操作。 – ildjarn

+0

哎呀,你是對的,編輯答案 – klasske

+2

另外'seq'與尾遞歸相比非常慢/對於 – FuleSnabel