Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我可以拦截F#序列发生器吗?_F#_Sequence - Fatal编程技术网

我可以拦截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")