2015-05-21 8 views
6

बाहरी लाइब्रेरी में किसी समस्या के आसपास काम करने की कोशिश कर रहा है - क्या जेनरेटर आइटम को आइटम द्वारा आइटम को पकड़ने का कोई तरीका है (शायद नहीं, लेकिन बस सुनिश्चित करने के लिए ...)?क्या मैं एफ # अनुक्रम जनरेटर को रोक सकता हूं?

let myTest() = 
    let mySeq = seq { for i in -3 .. 3 -> 1/i } 
    // how to keep the line above intact, but modify the code below to try-catch-ignore the bad one? 
    mySeq |> Seq.iter (fun i -> printfn "%d" i) 
    () 

उत्तर

7

आप नहीं कर सकते।
एक बार अपवाद होता है, तो स्रोत गणनाकर्ता की स्थिति खराब हो जाती है। यदि आप अपने राज्य को "ठीक करने" के लिए स्रोत गणनाकर्ता में नहीं जा सकते हैं, तो आप इसे मूल्यों को बनाए रखने में सक्षम नहीं हो सकते हैं।

आप कर सकते हैं, हालांकि, पूरी प्रक्रिया "रोक" अपवाद के बाद करते हैं, लेकिन आप IEnumerator<T> साथ नीचे एक स्तर और काम के लिए जाना होगा:

let takeUntilError (sq: seq<_>) = seq { 
    use enm = sq.GetEnumerator() 
    let next() = try enm.MoveNext() with _ -> false 
    let cur() = try Some enm.Current with _ -> None 

    while next() do 
     match cur() with 
     | Some c -> yield c 
     | None ->() 
    } 

mySeq |> takeUntilError |> Seq.iter (printf "%d") 
संबंधित मुद्दे