2017-02-20 21 views
5

Tôi có một quy trình tuần tự với điều kiện thoát tùy chọn. Một cách để viết các thuật toán là như thế nàyCách chức năng sạch sẽ để thoát khỏi vòng lặp chuỗi

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

Chi phí kiểm tra more cho các vị trí bị bỏ qua do thoát là không đáng kể. Tuy nhiên, có vẻ như phải có một cách thanh lịch hơn để thể hiện điều này.

Trả lời

9

Đệ quy là bình thường ở đây:

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

Trình biên dịch sẽ giảm điều này đến một vòng lặp đơn giản (không thực tế đệ quy diễn ra).

+2

+1: Đệ quy đệ quy là cách để thực hiện nó trong F # và nó cũng thường có nghĩa là bạn có thể tránh các biến có thể thay đổi dẫn đến mã thành ngữ hơn. – FuleSnabel

4

Một cách để làm điều này sẽ được sử dụng Seq.takeWhile

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

này sẽ thoát khỏi vòng lặp khi process() lợi nhuận false

+2

'Seq' là lười; điều này sẽ không làm gì trừ khi trình tự thực sự được lặp lại. – ildjarn

+0

Rất tiếc, bạn đã đúng, đã chỉnh sửa câu trả lời – klasske

+2

Ngoài ra 'seq' rất chậm so với đuôi đệ quy/cho – FuleSnabel

Các vấn đề liên quan