我可以拦截F#序列发生器吗?
试图解决库外的问题-是否有办法逐项捕获生成器本身(可能没有,但只是为了确保…) 你不能这样做。我可以拦截F#序列发生器吗?,f#,sequence,F#,Sequence,试图解决库外的问题-是否有办法逐项捕获生成器本身(可能没有,但只是为了确保…) 你不能这样做。 一旦发生异常,源枚举器的状态就会出错。如果无法进入源枚举器“修复”其状态,则无法使其继续生成值 但是,您可以在异常发生后使整个过程“停止”,但您必须转到下面的级别并使用IEnumerator: let takentillerror(sq:seq)=seq{ 使用enm=sq.GetEnumerator() 让next()=使用->false尝试enm.MoveNext() 让cur()=使用->Non
一旦发生异常,源枚举器的状态就会出错。如果无法进入源枚举器“修复”其状态,则无法使其继续生成值 但是,您可以在异常发生后使整个过程“停止”,但您必须转到下面的级别并使用
IEnumerator
:
let takentillerror(sq:seq)=seq{
使用enm=sq.GetEnumerator()
让next()=使用->false尝试enm.MoveNext()
让cur()=使用->None尝试一些enm.Current
而next()做什么
将cur()与
|一些c->产生c
|无->()
}
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)
()
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")