要在OCaml中处理异常情况,通常可以选择捕获异常或使用类型'a option
。如果我理解正确,由于函数Stream.next
(引发异常(和Stream.peek
/Stream.junk
(返回'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在垃圾收集短命值方面非常出色。
我个人喜欢使用选项,因为这两种情况类似。但是,使用peek
和junk
似乎比使用一个返回选项的函数要麻烦得多。因此,对于这种情况,我可能会使用基于异常的处理。
换句话说,(在我看来(这是一个判断。