2013-05-14 6 views

उत्तर

23

कम जवाब नहीं है। आप आमतौर पर समान कार्यक्षमता व्यक्त करने के लिए कुछ उच्च-आदेश फ़ंक्शन का उपयोग करेंगे। ऐसे कई कार्य हैं जो आपको विभिन्न पैटर्न के अनुरूप ऐसा करने देते हैं (इसलिए यदि आप वर्णन करते हैं कि आपको वास्तव में क्या चाहिए, तो कोई आपको बेहतर उत्तर दे सकता है)।

seq { 0 .. 100 } |> Seq.tryFind (fun i -> 
    printfn "%d" i 
    i=66) 

व्यवहार में, इस करता है, तो जाने के लिए सबसे अच्छा तरीका है:

उदाहरण के लिए, tryFind समारोह जो आप कुछ इस तरह लिखने देता है एक दृश्य है जिसके लिए किसी दिए गए विधेय रिटर्न true, से पहले मान देता है आप कुछ उच्च स्तरीय तर्क व्यक्त कर रहे हैं और एक संबंधित कार्य है।

let rec loop n = 
    if n < 66 then 
    printfn "%d" n 
    loop (n + 1) 

loop 0  

एक और अधिक विदेशी विकल्प (जो के रूप में कुशल नहीं है, लेकिन DSLs के लिए अच्छा हो सकता है) है कि आप एक गणना अभिव्यक्ति को परिभाषित कर सकते है: क्या तुम सच में break की तरह कुछ व्यक्त करने के लिए की जरूरत है, तो आप एक पुनरावर्ती समारोह का उपयोग कर सकते जो आपको break और continue लिखने देता है। Here is an example, लेकिन जैसा कि मैंने कहा, यह उतना कुशल नहीं है।

4

आपको इसे थोड़ी देर के लिए बदलना होगा।

let (i, ans) = (ref 0, ref -1) 
while(!i < 100 and !ans < 0) do 
if !i = 66 then 
    ans := !i 
ans 

(यह टूट जाता है जब मैं 66 के लिए हो जाता है - लेकिन हां वाक्य रचना काफी अलग आदि है, एक और चर शुरू की है,)

+1

और चूंकि यह 'i' में वृद्धि नहीं करता है, यह वास्तव में काफी समय लगता है। :-) –

2

यह वास्तव में बदसूरत है, लेकिन मेरे मामले में यह काम किया।

let mutable Break = false 
while not Break do 
    //doStuff 

    if breakCondition then 
     Break <- true 
done 

इस के लिए उपयोगी है do-while लूप में है, क्योंकि यह गारंटी देता है कि पाश में कम से कम एक बार निष्पादित कर रहा है।

मुझे आशा है कि एक और अधिक सुरुचिपूर्ण समाधान होगा। मुझे रिकर्सिव पसंद नहीं है, क्योंकि मैं स्टैक ओवरफ्लो से डरता हूं। :-(

0
seq { 
    for i = 0 to 99 do 
     if i = 66 then yield() 
} 
|> Seq.tryItem 0 
|> ignore 
0

समस्याओं के इन प्रकार के लिए आप एक पुनरावर्ती क्रिया इस्तेमाल कर सकते हैं

let rec IfEqualsNumber start finish num = 
    if start = finish then false 
    elif 
     start = num then true 
    else 
     let start2 = start + 1 
     IfEqualsNumber start2 finish num 
0

आज़माएं:।

exception BreakException 

try 
    for i = 0 to 99 do 
     if i = 66 then 
     raise BreakException 
with BreakException ->() 

मुझे पता है कि कुछ लोगों को उपयोग करने के लिए पसंद नहीं है अपवाद। लेकिन इसमें योग्यता है।

  • आप जटिल रिकर्सिव फ़ंक्शन के बारे में सोचना नहीं है। का कारण आप ऐसा कर सकते हैं, लेकिन कभी-कभी यह अनावश्यक रूप से परेशान होता है और अपवाद का उपयोग करना आसान है।

  • यह विधि आपको लूप बॉडी के आधे रास्ते में तोड़ने की अनुमति देती है। (ब्रेक "ध्वज" विधि भी सरल है लेकिन यह केवल लूप बॉडी के अंत में तोड़ने की अनुमति देता है।)

  • आप आसानी से नेस्टेड लूप से बच सकते हैं।

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