我可以拦截 F# 序列生成器吗?
Can I intercept the F# sequence generator?
试图解决外部库中的问题 - 有没有一种方法可以逐项尝试捕获生成器本身(可能不是,但只是为了确定...)?
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)
()
你不能。
一旦发生异常,源枚举器的状态就会被搞砸。如果您无法进入源枚举器 "fix" 它的状态,您就无法让它继续产生值。
但是,您可以在异常之后进行整个过程 "stop",但是您必须进入下一级并使用 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")
试图解决外部库中的问题 - 有没有一种方法可以逐项尝试捕获生成器本身(可能不是,但只是为了确定...)?
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)
()
你不能。
一旦发生异常,源枚举器的状态就会被搞砸。如果您无法进入源枚举器 "fix" 它的状态,您就无法让它继续产生值。
但是,您可以在异常之后进行整个过程 "stop",但是您必须进入下一级并使用 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")