OCaml Streams:异常处理还是选项类型?

OCaml Streams: exception handling or Option types?

为了处理 OCaml 中的异常情况,通常可以选择捕获异常或使用类型 'a option。如果我理解正确,由于函数 Stream.next(引发异常)和 Stream.peek/Stream.junk(return 'a option),这两种选择对于 Streams 都是可能的。

有区别吗
match Stream.peek t with
| None -> ***
| Some c -> Stream.junk t; *****

try
  let c = Stream.next t in *****
with Stream.Failure -> ***

其中 t 是类型 'a stream 的变量,而 ******** 是一些表达式序列?

编辑 2020-12-03

从OCaml 4.02开始,也可以把上面的写成

match Stream.next t with
| c -> *****
| exception Stream.Failure -> ***

如果要在 c 上进行进一步的模式匹配,这可能更可取,例如,

match Stream.next t with
| [] -> *****
| a::b -> *******
| exception Stream.Failure -> ***

(来源:Xavier Leroy 的幻灯片 OCaml 4.02 中的新功能)。

如您所见,行为没有差异。

具有选项类型的版本将使用更多数据,因为它必须为返回的每个值创建 Some x。一般来说,这将是一个很小的影响,因为 OCaml 在垃圾收集短期值方面非常出色。

我个人喜欢使用选项,因为这两种情况之间存在并行性。但是使用 peekjunk 似乎比仅具有 returns 一个选项的功能要笨拙得多。所以对于这种情况,我可能会使用基于异常的处理。

换句话说,这是一个判断电话(在我看来)。