2015-05-21 20 views
6

Dış kütüphanede bir sorunla uğraşmaya çalışmak - Jeneratörün kendisini öğeye göre öğeyi yakalamanın bir yolu var mı (muhtemelen değil, ama emin olmak için ...)?F # dizisi jeneratörünü engelleyebilir miyim?

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) 
    () 

cevap

7

Yapamazsınız.
Özel durum gerçekleştiğinde, kaynak numaralandırıcının durumu bozulur. Durumunu "düzeltmek" için kaynak numaralandırıcısına giremezseniz, değerleri üretmeye devam edemezsiniz.

Ancak, istisna sonrası tüm süreci "Dur" yapabilir, ancak IEnumerator<T> ile aşağıda düzeyi ve işe gitmek gerekir:

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") 
İlgili konular