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

标签 f# sequence

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

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

最佳答案

你不能。
一旦异常发生,源枚举器的状态就被搞砸了。如果你不能进入源枚举器来“修复”它的状态,你就不能让它继续产生值。

但是,您可以在异常发生后使整个过程“停止”,但您必须下一个级别并使用 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")

关于f# - 我可以拦截 F# 序列生成器吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30385145/

相关文章:

f# - ".NET"和 "OCaml"签名格式

mysql - 使用 F# 连接到 Visual Studio 2017 中的 MySQL 数据库

MySql 查询用于识别表中的序列

python,通过坐标从DAS获取序列

r - 创建组 ID 序列但省略特定行

generics - 为什么F#编译器有时会错误地泛化函数?

api - 如何在 F# 中隐藏方法?

F# 函数很好,但从 main 调用时不行

jQuery 图像淡入淡出序列?

asynchronous - 在 F# 中展平嵌套的异步序列