2015-05-21 31 views
6

próbuje obejść problem z biblioteką zewnętrzną - czy istnieje sposób, aby spróbować przechwycić sam generator przez element (prawdopodobnie nie, ale po to, aby się upewnić ...)?Czy mogę przechwycić generator sekwencji F #?

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

Odpowiedz

7

Nie możesz.
Po wystąpieniu wyjątku następuje wykasowanie stanu modułu wyliczającego źródło. Jeśli nie możesz uzyskać dostępu do modułu wyliczającego źródła, aby "naprawić" jego stan, nie możesz sprawić, że będzie on nadal generował wartości.

Można jednak sprawić, że cały proces „stop” po wyjątku, ale będziesz musiał zejść poniżej poziomu i pracować z 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")