我可以拦截F#序列生成器吗?

And*_*res 6 f# sequence

试图解决外部库中的问题 - 有没有办法尝试 - 逐项捕获生成器本身(可能不是,但只是为了确保......)?

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)
    ()
Run Code Online (Sandbox Code Playgroud)

Fyo*_*kin 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")
Run Code Online (Sandbox Code Playgroud)