2017-02-20 3 views
5

मेरे पास वैकल्पिक निकास स्थिति के साथ अनुक्रमिक प्रक्रिया है। एक तरीका यह एल्गोरिदम लिखने के लिए इसअनुक्रम लूप को तोड़ने के लिए साफ कार्यात्मक तरीका

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

तरह स्लॉट कि वजह से एक निकास नगण्य है को छोड़ दिया जाता है के लिए जाँच more की भूमि के ऊपर है। फिर भी, ऐसा लगता है कि इसे व्यक्त करने के लिए एक और शानदार तरीका होना चाहिए।

उत्तर

9

Recursion यहाँ हमेशा की तरह है:

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

संकलक कम हो जाएगा यह एक साधारण पाश पर (वास्तविक रिकर्सन होता है)।

+2

+1 के लिए 'seq' बहुत धीमी है +1: टेल-रिकर्सन एफ # में ऐसा करने का तरीका है और इसका भी अर्थ है कि आप परिवर्तनीय चर से बच सकते हैं अधिक idiomatic कोड के लिए अग्रणी। – FuleSnabel

4

यह कर किया जाएगा का एक तरीका यह Seq.takeWhile

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

यह उपयोग करने के लिए लूप से बाहर हो जाएंगे जब process() रिटर्न false

+2

'सेक' आलसी है; यह तब तक कुछ नहीं करेगा जब तक अनुक्रम वास्तव में पुनरावृत्त नहीं होता है। – ildjarn

+0

ओह, आप सही हैं, उत्तर – klasske

+2

संपादित करें पूंछ रिकर्सन/ – FuleSnabel

संबंधित मुद्दे