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

Exception OCaml流:异常处理还是选项类型?,exception,stream,try-catch,ocaml,Exception,Stream,Try Catch,Ocaml,要在OCaml中处理异常情况,通常可以选择捕获异常或使用type'a选项。如果我理解正确,由于函数Stream.next(引发异常)和Stream.peek/Stream.junk(返回'a选项),这两个选项都可以用于流 两者之间有什么区别吗 match Stream.peek t with | None -> *** | Some c -> Stream.junk t; ***** 及 其中,t是类型为'a stream的变量,***和******是一些表达式序列吗 编辑2020

要在OCaml中处理异常情况,通常可以选择捕获异常或使用type
'a选项
。如果我理解正确,由于函数
Stream.next
(引发异常)和
Stream.peek
/
Stream.junk
(返回
'a选项
),这两个选项都可以用于流

两者之间有什么区别吗

match Stream.peek t with
| None -> ***
| Some c -> Stream.junk t; *****

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

编辑2020-12-03

由于OCAML4.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中的新增功能)。

正如您所注意到的,行为上没有差异

带有选项类型的版本将增加一些数据,因为它必须为每个返回的值创建一些x。这通常只是一个小影响,因为OCaml在垃圾收集短期值方面非常出色

我个人喜欢使用选项,因为这两种情况之间是并行的。但是使用
peek
junk
似乎比只使用返回选项的函数要麻烦得多。因此,对于这种情况,我可能会使用基于异常的处理

换言之,这是一个判断(在我看来)

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